2017-07-14 4 views
1

Articles similaires ici:comparer récursive des fichiers spécifiques dans des répertoires différents

Diff files present in two different directories

et ici:

https://superuser.com/q/602877/520666

Mais pas tout à fait ce que je cherche.

J'ai 2 répertoires (contenant des sous-répertoires et différents types de fichiers - binaires, images, html, etc.). Je veux être capable de comparer récursivement des fichiers avec des extensions spécifiques (par exemple, .html, .strings, etc.) entre les deux répertoires - ils peuvent exister ou non dans un (sous-) répertoire.

Comment puis-je accomplir ceci? Diff seulement semble soutenir les exclusions, et je ne suis pas sûr de savoir comment je peux tirer parti de Find pour cela.

Conseil?

Répondre

0

Vous pouvez exclure tous les fileendings indésirables avec find:

(cette version correspond uniquement contre les terminaisons de fichiers)

diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' | sort -u | grep -v YOURFILETYPE | paste -sd "|"` ...rest of diff command 

Ou vous générer la liste des fichiers exclus dès le départ et le transmettre à la diff:

(cette version correspond également des noms de fichiers et tous les autres regex que vous spécifiez dans include.file)

find /dirA -type f | grep -v YOURFILEENDING > exclude.list 
find /dirB -type f | grep -v YOURFILEENDING >> exclude.list 
diff -X exclude.list -r /dirA /dirB 

Si vous enchaînez ces commandes via && vous obtiendrez une oneliner à portée de main;)


AVEC fichier Include

Si vous souhaitez utiliser un fichier inclus, vous pouvez utiliser cette méthode:

  1. Vous spécifiez le fichier à inclure
  2. grep correspond contre tous les fichiers dans les dossiers et transforme votre inclus udefile dans un fichier d'exclusion pour diff (diff ne prend exclure des fichiers)

Voici un exemple:

version en ligne Compliqué:

(cette version correspond uniquement contre les terminaisons de fichiers)

diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' sort -u | grep -v -f include.file | paste -sd "|"` /dirA /dirB 

Version légèrement plus longue:

(cette version correspond également au nom de fichier s et tous les autres regex que vous spécifiez dans include.file)

find /dirA -type f | grep -v -f include.file > exclude.list 
find /dirB -type f | grep -v -f include.file >> exclude.list 
diff -X exclude.list -r /dirA /dirB 

avec chaque ligne comprise.fichier étant un grep regex/expression:

log 
txt 
fileending3 
whateverfileendingyoulilke 
fullfilename.txt 
someotherregex.* 

NOTE

Je ne courais pas ce parce que je suis loin d'être un ordinateur. J'espère avoir toute la syntaxe correcte.

+0

J'aime cette idée, mais comment pourrais-je utiliser une méthode inversée et seulement diff par rapport à une "include.list"? – vmoralito

+0

@vmoralito Je viens de mettre à jour mon article et j'ai trouvé une méthode pour générer dynamiquement un fichier d'exclusion à partir d'un fichier d'inclusion, car diff ne prend que le fichier d'exclusion. Mais en utilisant le chemin ci-dessus, vous pouvez utiliser votre fichier include. –

0

La chose la plus simple que vous pouvez faire est de comparer l'ensemble des répertoires:

diff -r /path/the/first /path/the/second 

Il montrera quels sont les fichiers que dans l'un des répertoires, fichiers qui diffèrent de façon binaire, et la pleine diff pour tous les fichiers textuels dans les deux répertoires.

Vous pouvez boucler sur un ensemble de chemins relatifs en lisant simplement un fichier avec un chemin par ligne ainsi:

while IFS= read -u 9 relative_path 
do 
    diff "/path/the/first/%{relative_path}" "/path/the/second/%{relative_path}" 
done 9< relative_paths.txt 

Faire cela pour un ensemble spécifique de extensions est tout aussi facile:

shopt -s globstar 
while IFS= read -u 9 extension do 
    diff "/path/the/first/"**/*."${extension}" "/path/the/second/"**/*."${extension}" 
done 9< extensions.txt 
+0

Cela a déjà été couvert dans les messages référencés dans la question. Malheureusement, il y a plus de 2600 fichiers dans chaque répertoire 'parent', et BEAUCOUP d'entre eux contiendront des changements dont je ne me soucie pas. Je suis seulement intéressé par les changements pour les fichiers spécifiques dont je dois m'inquiéter. Je vais continuer à fouiner. – vmoralito