Je cherche à exécuter une commande Linux qui comparera récursivement deux répertoires et ne produira que les noms de fichiers de ce qui est différent. Cela inclut tout ce qui est présent dans un répertoire et non l'autre ou vice versa, et les différences de texte.
linux
command-line
diff
barfoon
la source
la source
diff
page de manuel de CentOS 7 décrit-q
comme "signaler uniquement lorsque les fichiers diffèrent", ce qui est moins clair que ce que vous avez écrit.-x PATTERN
dans la commande pour exclure certains sous-répertoires. Par exemple,diff -qr repo1 repo2 -x ".git"
comparera deux répertoires mais exclura les chemins d'accès aux fichiers contenant ".git".Vous pouvez également utiliser rsync
la source
--size-only
il manquera des fichiers de taille identique mais de contenu différent, par exemple ancien / version.txt "29a" nouveau / version.txt "29b" . Utilisez à la place:rsync -ric --dry-run old/ new/
où l'argument "-i" permet d'obtenir la liste des fichiers directement viarsync -ric --dry-run old/ new/ | cut -d" " -f 2
Si vous souhaitez obtenir une liste de fichiers qui ne se trouvent que dans un seul répertoire et non leurs sous-répertoires et uniquement leurs noms de fichiers:
Si vous souhaitez répertorier récursivement tous les fichiers et répertoires qui sont différents avec leurs chemins d'accès complets:
De cette façon, vous pouvez appliquer différentes commandes à tous les fichiers.
Par exemple, je pourrais supprimer tous les fichiers et répertoires qui se trouvent dans dir1 mais pas dir2:
la source
Sur mon système Linux pour obtenir uniquement les noms de fichiers
la source
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
fonctionne bien pour moi!L'approche de l'exécution
diff -qr old/ new/
a un inconvénient majeur: il peut manquer des fichiers dans des répertoires nouvellement créés. Par exemple, dans l'exemple ci-dessous, le fichierdata/pages/playground/playground.txt
n'est pas dans la sortie dediff -qr old/ new/
tandis que le répertoire l'data/pages/playground/
est (recherchez aire de jeux.txt dans votre navigateur pour comparer rapidement). J'ai également posté la solution suivante sur Unix et Linux Stack Exchange , mais je la copierai ici également:Pour créer une liste de fichiers nouveaux ou modifiés par programme, la meilleure solution que j'ai pu trouver consiste à utiliser rsync , sort et uniq :
Je m'explique avec cet exemple: nous voulons comparer deux versions de dokuwiki pour voir quels fichiers ont été modifiés et lesquels ont été nouvellement créés.
Nous récupérons les goudrons avec wget et les extrayons dans les répertoires
old/
etnew/
:L'exécution de rsync dans un sens peut manquer des fichiers nouvellement créés, comme le montre la comparaison de rsync et diff:
donne la sortie suivante:
L'exécution de rsync dans un seul sens manque les fichiers nouvellement créés et dans l'autre sens, les fichiers supprimés sont manquants, comparez la sortie de diff:
donne la sortie suivante:
L'exécution de rsync dans les deux sens et le tri de la sortie pour supprimer les doublons révèlent que le répertoire
data/pages/playground/
et le fichierdata/pages/playground/playground.txt
ont été manqués initialement:donne la sortie suivante:
rsync
est exécuté avec ces arguments:-r
"recurse dans les répertoires",-c
pour comparer également des fichiers de taille identique et uniquement "sauter en fonction de la somme de contrôle, pas du temps et de la taille du mod",-n
"effectuer un essai sans aucune modification", et--out-format="%n"
à "sortie des mises à jour en utilisant le FORMAT spécifié", qui est "% n" ici pour le nom de fichier uniquementLa sortie (liste des fichiers)
rsync
dans les deux sens est combinée et triée à l'aide desort
, et cette liste triée est ensuite condensée en supprimant tous les doublons avecuniq
la source
diff new/ old/
) pour voir quels répertoires ont été supprimés?diff -qr new/ old/
de l'exemple ci-dessus avec les tars dokuwiki produit la même sortie quediff -qr old/ new/
- c'est-à-dire que vous voyez que le répertoire est nouveau / manquant mais pas les fichiers qu'illa source