GNU/Linux >> Tutoriels Linux >  >> Linux

Comment puis-je faire en sorte que 'diff -X' ignore des chemins spécifiques et non des noms de fichiers ?

Les répertoires d'inscription devraient fonctionner; par exemple, voici ce que j'ai utilisé dans un script (en supposant que gnu diff),

diff -r \
   --exclude="*~" \
   --exclude=".svn" \
   --exclude=".git" \
   --exclude="*.zip*" \
   --exclude="*.gz" \
   --exclude="*.tar" \
   ...etc

...qui ignore le contenu de .svn et .git dirs, mais aussi des fichiers individuels nommés *.zip /*.gz /etc.

Modifier : Pour filtrer les chemins de la forme dir_a/file1 mais toujours diff fichiers avec le même nom de base, comme dir_b/file1 ou dir_a/b/file1 , puis une liste de fichiers à diff devrait être généré (par exemple, en utilisant find ), et le fichier à comparer dérivé de ces chemins ; par exemple, donné

$ find ONE TWO -type f -print 
ONE/a/1.txt
ONE/a/2.txt
ONE/a/b/2.txt
TWO/a/1.txt
TWO/a/2.txt
TWO/a/b/2.txt

vous générez la liste des fichiers à comparer, en excluant par exemple */a/2.txt mais toujours en comparant d'autres fichiers nommés 2.txt . "Trouvez" simplement tous les fichiers sauf ONE/a/2.txt (une expression rationnelle peut également être utilisée ici, telle que .*/a/2.txt )

$ find ONE -type f \( ! -regex 'ONE/a/2.txt' \) \
    -exec bash -c 'diff -q "${1}" "${2/ONE/TWO}"' - {} {} \;  

qui en fait ignore ONE/a/2.txt (et TWO/a/2.txt ), mais compare toujours les autres fichiers nommés 2.txt :

diff -q ONE/a/1.txt TWO/a/1.txt
diff -q ONE/a/b/2.txt TWO/a/b/2.txt

Modifier : Ou plus amusant avec find (amusement supplémentaire laissé comme exercice pour le lecteur), sélectionnez les fichiers ou répertoires à exclure puis diff tout le reste :

$ find ONE \( -regex 'ONE/a/2.txt' -o -name b  -prune \)  \
    -o -type f -exec bash -c 'echo diff -q "${1}" "${2/ONE/TWO}"' - {} {} \

L'exemple ci-dessus exclut le fichier spécifique "{top}/a/2.txt", tout répertoire nommé "b", et tout le reste est comparé. (Au lieu du simple "-name b " vous pouvez également utiliser "-regex '.*/b' " - notez qu'il n'y a pas de "/".)


J'ai eu le même problème alors j'ai créé un patch pour diff . Le correctif n'a pas encore été accepté, mais vous pouvez créer votre propre version de diff avec le correctif ou installez sur Arch Linux avec un package AUR.

Voici le diff correctif.


Pour exclure le répertoire directory/sub-directory , j'utilise

diff -r <src-dir> <dest-dir> | grep -v directory/sub-directory

Cependant, bien que cela devrait fonctionner pour une seule exclusion, cela ne devrait pas être possible pour une longue liste d'ignorés comme vous l'avez fait.


Linux
  1. Comment rendre le fichier et le répertoire ineffaçables, même par racine sous Linux

  2. Comment faire en sorte qu'Ibus n'ignore pas ~/.xcompose ?

  3. Comment puis-je vérifier qu'un fichier existe et exécuter une commande sinon?

  4. Comment rendre un fichier en lecture seule permanent sous Linux afin que même root ne puisse pas le modifier ?

  5. Comment puis-je cater un fichier et supprimer les lignes commentées ?

Comprendre les chemins de fichiers et comment les utiliser sous Linux

Comment travailler avec des liens durs et des liens souples sous Linux

comment puis-je différencier deux sections du même fichier ?

Comment compresser un fichier et conserver le fichier .gz ?

Comment puis-je faire une session sudo d'une heure et non de quelques minutes dans Ubuntu 10.04 ?

Comment puis-je m'assurer que mon système utilise le fichier ~/.screenrc ?