2016-10-18 1 views
1

Sur Solaris 10, j'ai deux répertoires ayant pour la plupart le même jeu de fichiers dans les deux répertoires, mais il peut y avoir quelques fichiers présents uniquement dans un répertoire. la presque même liste de fichiers. Avec la commande diff, je peux voir les différences individuelles. Avec une combinaison de diff une déclaration find exécuter dans une boucle comme ci-dessous:Statistiques des modifications apportées au contenu du fichier comapring présent dans deux répertoires différents

for i in `find $DIRNM -type f` 

Je peux vérifier les différences individuelles des fichiers. Mais, j'ai besoin d'avoir des statistiques comme combien ont changé, combien de lignes ajoutées, combien de lignes supprimées, et combien de lignes modifiées. Comment puis-je faire cela avec l'aide d'un script shell.

Répondre

0

Si elle est disponible sur votre système, j'utiliser à la fois diff et diffstat

diff -Naur dir1 dir2 | diffstat 
0

Ces commandes bash comparera vos deux listes d'annuaire (par nom, ne se contente pas):

mylist() { find "$1" -type f |sed "s:$1::"; } 
diff <(mylist dir1) <(mylist dir2) 

Il est possible que ceux-ci finissent par être non triés. Si tel est le cas, ajoutez sort à la fonction d'aide:

mylist() { find "$1" -type f |sed "s:$1::" |sort; } 

Ceux-ci utilisent process substitution pour exécuter les deux commandes find et comparer leurs résultats avec diff. Si vous voulez une comparaison côte à côte, essayez plutôt vimdiff. Si les lignes sont très très longues, vous pouvez souhaiter que la première sortie soit en haut et la deuxième en bas. Si vous n'aimez pas non plus vim, essayez plutôt diff -y.

 

Pour quantifier les différences dans le contenu du fichier, comme mentionné dans la oliv's answer solution la plus simple est diff -ur dir1 dir2 |diffstat. Si vous ne disposez pas que disponible, vous pouvez le faire avec awk:

diff -Nur dir1 dir2 |awk ' 
    $1 == "+++" { new = $2 } # use $0 if you have filenames with spaces in them 
    /^-/ { change[new]-- } 
    /^\+/ { change[new]++ } 
    END { for (f in change) if (f) printf "%s %+d\n", f, change[f] }' 

Pour les non-initiés, awk est un analyseur en ligne par ligne conditionalized séparés sur le terrain. Par défaut, les champs sont divisés sur les espaces, de sorte que la première clause indique si le premier champ est +++, stocker le deuxième champ. Si vous avez des noms de fichiers avec des espaces, affectez new = $0 à la place. Les deuxième et troisième clauses décrémentent ou incrémentent le compteur de ce fichier.

La clause finale, qui se produit lorsque l'entrée a été épuisée, boucle chaque fichier (clé) f dans le tableau associatif (dictionnaire) change. En supposant que ce n'est pas vide, nous imprimons le fichier et son nombre de lignes modifiées. J'ai utilisé %+d pour donner un signe + à des valeurs positives (comme diff).

Whitespace, y compris les sauts de ligne, peuvent être effondrées dans le code awk tant que vous ne mettez pas les lettres ensemble (vous pouvez faire $1=="+++"{new=$2}/^-/{… sur une ligne sans espace, mais vous ne pouvez pas faire for(finchange) car elle supposera finchange est un variable). L'espacement est beaucoup plus lisible.

Ceci affiche le nombre total de lignes modifiées; un +0 signifie que autant de lignes ont été ajoutées que soustraites, pas que le fichier est inchangé. Il ne devrait pas être trop difficile de modifier ce code pour compter les additions et les soustractions (il suffit d'utiliser deux hachages au lieu d'un, puis d'utiliser deux boucles pour imprimer chaque compte par fichier dans la clause finale.)