J'essaie de trouver les fichiers existants dans un répertoire mais pas dans l'autre, j'ai essayé d'utiliser cette commande:
diff -q dir1 dir2
Le problème avec la commande ci-dessus qui trouve les fichiers dans dir1
mais pas dans dir2
ainsi que les fichiers dans dir2
mais pas dans dir1
,
J'essaie de trouver les fichiers dir1
mais pas dir2
seulement.
Voici un petit échantillon de ce à quoi mes données ressemblent
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Une autre question me vient à l'esprit: comment puis-je trouver les fichiers dans dir1
mais pas dans dir2
ou dir3
dans une seule commande?
grep
pour^dir1
sûr que je ne reçois pas d'dir1
apparition plus tard dans le chemin.$4
comme exemple. En fait, sur mon Ubuntu actuel, lesdiff
réponses en italien.$4
est correct pour les réponses en italien et en anglais, mais je ne suis pas sûr pour toutes les autres langues ...Cela devrait faire le travail:
Options expliquées (via la page de manuel diff (1) ):
-r
- Comparez récursivement tous les sous-répertoires trouvés.-q
- Afficher uniquement si les fichiers diffèrent.la source
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
option: les pages de manuel ne disent que "Afficher uniquement si les fichiers diffèrent", pas comment il vérifie s'ils sont différents. J'ai parcouru le code source et découvert qu'il vérifie uniquement la taille des fichiers pour déterminer les différences, pas le contenu réel.-q
option je ne peux pas reproduire qu'elle ne vérifie que la taille du fichier. Utilisation de GNU Diffutils 3.7 en comparant deux fichiers avec la même taille de fichier mais un contenu différent avec desdiff -q file1 file2
sortiesFiles file1 and file2 differ
.Cette commande vous donnera des fichiers qui sont en dir1 et non en dir2.
À propos de
<( )
signe, vous pouvez le rechercher sur Google en tant que «substitution de processus».la source
(ls -R dir1|sort)
pourrait faire l'affaire(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Une bonne façon de faire cette comparaison consiste à utiliser
find
avecmd5sum
, puis undiff
.Exemple:
Utilisez
find
pour répertorier tous les fichiers du répertoire, puis calculez le hachage md5 pour chaque fichier et dirigez-le vers un fichier:Effectuez la même procédure pour un autre répertoire:
Ensuite, comparez le résultat deux fichiers avec "diff":
Cette stratégie est très utile lorsque les deux répertoires à comparer ne se trouvent pas sur la même machine et que vous devez vous assurer que les fichiers sont égaux dans les deux répertoires.
Une autre bonne façon de faire le travail est d'utiliser git
Meilleures salutations!
la source
Meld ( http://meldmerge.org/ ) fait un excellent travail pour comparer les répertoires et les fichiers qu'il contient.
la source
Le plugin DirDiff de vim est un autre outil très utile pour comparer les répertoires.
Il répertorie non seulement les fichiers qui sont différents entre les répertoires, mais vous permet également d'inspecter / modifier avec vimdiff les fichiers qui sont différents.
la source
Insatisfait de toutes les réponses, car la plupart d'entre elles fonctionnent très lentement et produisent une sortie inutilement longue pour les grands répertoires, j'ai écrit mon propre script Python pour comparer deux dossiers.
Contrairement à de nombreuses autres solutions, il ne compare pas le contenu des fichiers. De plus, il ne va pas dans les sous-répertoires qui manquent dans un autre répertoire. La sortie est donc assez concise et le script fonctionne rapidement.
Exemple d'utilisation:
Ou si vous souhaitez voir uniquement les fichiers du premier répertoire:
PS Si vous avez besoin de comparer les tailles de fichiers et les hachages de fichiers pour d'éventuelles modifications, j'ai publié un script mis à jour ici: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
la source
Une autre approche (peut-être plus rapide pour les grands répertoires):
La
sed
commande supprime le premier composant du répertoire grâce à la publication d'Erik )la source
find
donc un commentaire et non une réponse séparée):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
Cela imprimera les fichiers présents dans dir2 mais pas présents dans dir1.C'est un peu tard mais ça peut aider quelqu'un. Je ne sais pas si diff ou rsync crachent uniquement des noms de fichiers dans un format nu comme celui-ci. Merci à plhn d'avoir donné cette belle solution que j'ai développée ci-dessous.
Si vous ne voulez que les noms de fichiers, il est donc facile de copier simplement les fichiers dont vous avez besoin dans un format propre, vous pouvez utiliser la commande find.
Cela suppose que dir1 et dir2 se trouvent dans le même dossier parent. sed supprime simplement le dossier parent afin que vous puissiez comparer les pommes avec les pommes. Le dernier sed remet juste le nom dir1.
Si vous voulez juste des fichiers:
De même pour les répertoires:
la source
cd
avant aufind
lieu d'avoir à utilisersed
, par exemple:comm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. (Lesexit
s sont là pour empêcherfind
d'utiliser le répertoire courant devraitcd
échouer.)comm
avec des supports-z
(fournie avec git.savannah.gnu.org/cgit/coreutils.git/commit/… ), vous pouvez le fairecomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (En attendant, j'ai aussi compris que lesexit
s pouvaient être remplacés.)La réponse acceptée répertorie également les fichiers qui existent dans les deux répertoires, mais dont le contenu est différent. Pour répertorier UNIQUEMENT les fichiers qui existent dans dir1, vous pouvez utiliser:
Explication:
la source
Cette réponse optimise l'une des suggestions de @ Adail-Junior en ajoutant l'
-D
option, qui est utile lorsqu'aucun des répertoires comparés n'est un référentiel git:Si vous utilisez,
-D
vous ne verrez pas de comparaisons avec/dev/null
:text Binary files a/whatever and /dev/null differ
la source
Une façon simplifiée de comparer 2 répertoires à l'aide de la commande DIFF
ouvrir filename.dat une fois l'exécution terminée
et vous verrez: Uniquement dans filename.1: filename.2 Uniquement dans: directory_name: name_of_file1 Uniquement dans: directory_Name: name_of_file2
la source
Ceci est le script bash pour imprimer les commandes de synchronisation de deux répertoires
la source
GNU
grep
peut inverser la recherche avec l'option-v
. Cela rend legrep
signalement des lignes qui ne correspondent pas. Par cela, vous pouvez supprimer les fichiersdir2
de la liste des fichiersdir1
.Les options
-F -x
indiquentgrep
d'effectuer une recherche de chaîne sur toute la ligne.la source