J'ai une question sur la commande diff si je veux un répertoire diff récursif mais uniquement 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 le type de fichier xml, même si il y a des fichiers dans le type d'image de dossier ( png
, gif
, jpg
), txt
, php
, etc.
comment différencier uniquement certains types de fichiers.
Réponses:
Vous pouvez spécifier
-x
plusieurs 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 faireinfo -f /usr/share/info/diff.info.gz
):la source
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.
Il semble
-x
donc n'accepter qu'un seul modèle lorsque vous signalez, mais si vous mettez tous les modèles que vous souhaitez exclure dans un fichier (vraisemblablement un par ligne), vous pouvez utiliser le deuxième indicateur comme ceci:où exclude.pats est:
la source
find . -type f -not -name '*.<my-ext>' | xargs -I% basename '%' | awk -F . 'NF > 1 { print "*." $NF}; NF == 1 { print $NF }' | sort | uniq > exclude.pats
find . -not -name "*.c" -and -not -name "*.h" -and -type f -print0 | xargs -0 basename | grep -E '.*\..+' | sed 's/\./\//g' | xargs basename | xargs printf '*.%s\n' | sort | uniq > X-FILE
je veux croire que cela aide, peut-être sous Linux aussi. (Dans cet exemple, un single-name "*.[ch]"
est correct, mais ce n'est pas très illustratif)Vous pouvez également utiliser find avec -exec pour appeler diff:
cd /destination/dir/1 find . -name *.xml -exec diff {} /destination/dir/2/{} \;
la source
L'absence de complément - inclure ...
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 un find tous les fichiers qui n'ont pas d'extensions que nous voulons inclure,sed
attrapons le nom de fichier et c'est juste:Par exemple:
find PATH1/ -type f | grep --text -vP "php$|html$" | sed 's/.*\///' | sort -u > file1 diff PATH1/ PATH2/ -rq -X file1
la source
find PATH1/ -type f | grep --text -v -e "php$" -e 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 entreDIR1
etDIR2
. Dans mon cas, cela n'a donné aucun faux positif, mais cela peut pour vous, en fonction du contenu de votre DIRS.diff --brief DIR1 DIR2 | grep tmpl
la source
Si vous le trouvez pratique, vous pouvez utiliser ce qui suit
Makefile
. Exécutez simplement: "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
la source
L'absence d'un -include complémentaire rend nécessaire l'utilisation de modèles heuristiques alambiqués tels que
pour trouver (principalement) des fichiers java!
la source
Si vous souhaitez différer 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 récupérer les fichiers qui n'existent que dans l'un des chemins.
la source
Bien que cela n'évite pas la réalité
diff
d'autres fichiers, si votre objectif est de produire un fichier de correctif, ou similaire, vous pouvez utiliser àfilterdiff
partir dupatchutils
package, par exemple pour ne corriger que vos.py
modifications:diff -ruNp /path/1 /path/2 | filterdiff -i "*.py" | tee /path/to/file.patch
la source