Comment différez-vous un répertoire uniquement pour les fichiers d’un type spécifique?

J’ai une question sur la commande diff si je veux un diff récursif de répertoire, mais seulement pour un type de fichier spécifique, comment faire?

J’ai essayé d’utiliser l’option d’exclusion mais je ne peux utiliser qu’un seul modèle:

$ diff /destination/dir/1 /destination/dir/2 -r -x *.xml 

Avec la commande, je ne peux exclure que le type de fichier XML, même s’il existe des fichiers dans le type d’image du dossier ( png , gif , jpg ), txt , php , etc.

Comment différer uniquement certains types de fichiers.

Vous pouvez spécifier -x plus d’une fois.

 diff -x '*.foo' -x '*.bar' -x '*.baz' /destination/dir/1 /destination/dir/2 

Dans la section Comparaison des répertoires de info diff (sur mon système, je dois faire l’ info -f /usr/share/info/diff.info.gz ):

Pour ignorer certains fichiers en comparant les répertoires, utilisez l’option ‘-x PATTERN’ ou ‘–exclude = PATTERN’. Cette option ignore tous les fichiers ou sous-répertoires dont les noms de base correspondent au modèle de shell PATTERN. Contrairement au shell, un point au début de la base d’un nom de fichier correspond à un caractère générique au début d’un motif. Vous devez inclure PATTERN dans des guillemets pour que le shell ne le développe pas. Par exemple, l’option -x ‘*. [Ao]’ ignore tout fichier dont le nom se termine par ‘.a’ ou ‘.o’.

Cette option s’accumule si vous le spécifiez plus d’une fois. Par exemple, en utilisant les options -x ‘RCS’ -x ‘*, v’ ignore tout fichier ou sous-répertoire dont le nom de base est ‘RCS’ ou se termine par ‘, v’.

Tiré de (une version de) la page de manuel:

 -x PAT --exclude=PAT Exclude files that match PAT. -X FILE --exclude-from=FILE Exclude files that match any pattern in FILE. 

Donc, il semble que -x n’accepte qu’un seul motif pendant que vous rapportez, mais si vous mettez tous les motifs que vous voulez exclure dans un fichier (probablement un par ligne), vous pouvez utiliser le second drapeau comme ceci:

 $ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats 

où exclude.pats est:

 *.jpg *.JPG *.xml *.XML *.png *.gif 

L’absence d’un complément – y compris ….

Nous pouvons faire une solution de contournement, un fichier d’exclusion avec tous les fichiers, mais ce que nous voulons inclure. Donc, nous créons file1 avec un find tous les fichiers qui n’ont pas d’extensions que nous voulons inclure, sed attrape le nom du fichier et est juste: diff –exclude-from = file1 PATH1 / PATH2 /, exemple:

 find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1 

Vous pouvez également utiliser find avec -exec pour appeler diff:

 cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \; 

Si vous le trouvez commode, vous pouvez utiliser le Makefile suivant. Just run: “make patch”

 #Makefile for patches #Exlude following file endings SUFFIX += o SUFFIX += so SUFFIX += exe SUFFIX += pdf SUFFIX += swp #Exlude following folders FOLDER += bin FOLDER += lib FOLDER += Image FOLDER += models OPTIONS = Naur patch: rm test.patch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ org/ new/ > test.patch unpatch: rm test.unpatch diff -$(OPTIONS) \ $(foreach element, $(SUFFIX) , -x '*.$(element)') \ $(foreach element, $(FOLDER) , -x '$(element)*') \ new/ org/ > test.unpatch 

L’absence d’une –include complémentaire rend nécessaire l’utilisation de ces schémas heuristiques compliqués comme

 *.[A-Zb-ik-uw-z]* 

pour trouver (principalement) des fichiers Java!

Si vous voulez varier les sources et restr simple:

 diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files" 

Supprimez le dernier grep si vous souhaitez récupérer les fichiers qui existent dans un seul des chemins.

J’ai utilisé la commande suivante pour trouver le diff de tous les fichiers *.tmpl entre DIR1 et DIR2 . Dans mon cas, cela n’a pas donné de faux positifs, mais cela peut être pour vous, en fonction du contenu de votre DIRS.

diff --brief DIR1 DIR2 | grep tmpl