Existe-t-il un moyen de réaliser un diff récursif de deux répertoires mais de comparer uniquement (à leurs emplacements respectifs) les fichiers qui correspondent à un nom de fichier ou un prédicat de type de fichier spécifique?
Par exemple, je voudrais faire quelque chose comme
diff -r dir-a dir-b -filenames *.java, ivy.xml, build.xml
... ou mieux encore:
diff -r dir-a dir-b -filetype text
De toute évidence, il n'est pas obligatoire d'utiliser diff
car je suppose une incantation avec find
et -exec diff
pourrait également faire l'affaire (je ne sais tout simplement pas comment générer les chemins de fichiers complémentaires dans ce dernier cas).
command-line
find
diff
Marcus Junius Brutus
la source
la source
Réponses:
Shellscript
differ-r
Ce shellscript peut effectuer un diff récursif de deux répertoires mais comparer uniquement (à leurs emplacements respectifs) les fichiers qui correspondent à un nom de fichier ou un modèle de type de fichier spécifique.
Démo
Des dossiers:
Usage:
Courir
differ-r
:Les
diff
lignes de commande exécutées sont imprimées avec du texte vert et la sortie, lorsqu'il n'y a pas de correspondance, est imprimée avec le texte par défaut (blanc sur noir dans la capture d'écran suivante).rsync
avec filtreSi vous n'avez pas besoin d'obtenir de sortie décrivant la différence, sachez uniquement quels fichiers sont différents ou manquants (de sorte que vous
rsync
souhaitez les copier), vous pouvez utiliser la ligne de commande suivante.Démo
Si vous voulez une sortie propre sans lignes de commentaires et sans répertoires, vous pouvez
grep
la sortie comme ça,Shellscript
rsync-diff
Ce one-liner peut être transformé en commande de base d'un script shell
rsync-diff
.la source
Comme vous avez mentionné "Il est clair qu'il n'est pas obligatoire d'utiliser diff",
Cela devrait faire le travail pour vous MELD facilement configurable pour ce genre de types de fichiers à ignorer:
de plus, une autre alternative serait d'écrire un script simple qui sera transféré d'une liste blanche à une liste noire et ensuite la liste noire sera transmise au diff avec l'
--exclude
option.la source
Avec le shell prenant en charge la substitution de commandes, vous pouvez utiliser le one-liner suivant (comme déjà noté par @JammingThebBits):
Cela fonctionne comme ceci:
find
recherchez les fichiers sans intérêt,sed
extrayez le nom de base (l'exécutionbasename
est extrêmement lente si vous avez plusieurs fichiers) et les place dans un fichier temporaire ; ce fichier est ensuite passé àdiff
lui dire de les exclure de la comparaison (double exclusion = inclusion).Si vous n'avez pas de substitution de commande, placez la
sed
sortie dans un fichier et passez-la explicitement àdiff
.Dans l'exemple, je n'ai recherché que les fichiers XML et JAVA, modifiez-les si nécessaire en les séparant par OR.
la source