web-dev-qa-db-fra.com

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

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.

79
de_3

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'.

85
Dennis Williamson

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
19
jamesbtate

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

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

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 
5
Sérgio

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

3
Mikhail Golubitsky

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
2
Rafiz

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.

1
Alex

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!

1
Jerry Miller