J'ai une question à propos de la commande diff si je veux un répertoire récursif mais uniquement pour un type de fichier spécifique, comment procéder?
J'ai essayé d'utiliser l'option d'exclusion mais je ne peux utiliser qu'un seul motif:
$ 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 de dossier (png
, gif
, jpg
), txt
, php
, etc
comment ne différer que 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
À partir de la section Comparaison de répertoires de info diff
(sur mon système, je dois faire info -f /usr/share/info/diff.info.gz
):
Pour ignorer certains fichiers lors de la comparaison de 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 motif Shell Shell. 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 mettre PATTERN entre guillemets afin 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'.
Extrait 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, ça ressemble à -x
n'accepte qu'un seul motif lorsque vous le signalez, mais si vous mettez tous les motifs que vous souhaitez exclure dans un fichier (probablement un par ligne), vous pouvez utiliser le second indicateur comme suit:
$ diff /destination/dir/1 /destination/dir/2 -r -X exclude.pats
où exclude.pats est:
*.jpg
*.JPG
*.xml
*.XML
*.png
*.gif
Vous pouvez également utiliser find avec -exec pour appeler diff:
cd /destination/dir/1
find . -name *.xml -exec diff {} /destination/dir/2/{} \;
L'absence d'un complément - incluez ....
Nous pouvons faire une solution de contournement, un fichier d'exclusion avec tous les fichiers mais ce que nous voulons inclure. Nous créons donc file1
avec une recherche de tous les fichiers sans extension que nous voulons inclure, sed
récupère le nom du fichier et est simplement:
diff --exclude-from=file1 PATH1/ PATH2/
Par exemple:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1
diff PATH1/ PATH2/ -rq -X file1
J'ai utilisé la commande suivante pour trouver le diff de tous les *.tmpl
fichiers entre DIR1
et DIR2
. Dans mon cas, cela n'a généré aucun faux positif, mais cela peut vous arriver, en fonction du contenu de votre DIRS.
diff --brief DIR1 DIR2 | grep tmpl
Si cela vous convient, vous pouvez utiliser le code suivant Makefile
. Il suffit de lancer: "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
Si vous voulez différencier les sources et rester simple:
diff -rqx "*.a" -x "*.o" -x "*.d" ./PATH1 ./PATH2 | grep "\.cpp " | grep "^Files"
Supprimez le dernier grep si vous souhaitez obtenir les fichiers qui n'existent que dans l'un des chemins.
L’absence de complémentarité - notamment comprend la nécessité d’utiliser des schémas heuristiques compliqués comme
*.[A-Zb-ik-uw-z]*
trouver (principalement) Java!