Rechercher des fichiers dans un répertoire et non dans un autre

12

Existe-t-il des outils Linux / Unix qui trouvent tous les fichiers d'un répertoire non présents dans un autre? Fondamentalement, je recherche un diff qui fonctionne sur la sortie de ls.

Des scripts courts et doux sont également appréciés.

Willi Ballenthin
la source

Réponses:

20

diff le fait déjà:

diff dir1 dir2

Exemple de sortie:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
tobym
la source
5
C'est bon. Un seul reproche: diff s'exécute en fait sur chacun des fichiers qui se trouvent dans les deux. Existe-t-il une option obscure pour simplement exécuter contre les noms de fichiers (je l'ai peut-être manquée)? Sinon, je suggèrediff dir1 dir2 | grep "Only"
Willi Ballenthin
wow cela me fait économiser de nombreuses minutes de script bash merci
user5359531
10

Frapper:

diff <(cd dir1; ls) <(cd dir2; ls)

Comparez uniquement les noms de fichiers - pas le contenu des fichiers.

En pause jusqu'à nouvel ordre.
la source
Aussi ksh et zsh.
pause jusqu'à nouvel ordre.
utiliser rsync pour les
répertoires de
Ne pas analyser ls, utilisez findplutôt!
val dit Réintégrer Monica le
4

Comme les gens vous l'ont dit ici, vous pouvez utiliser DIFF dans diverses variantes d'utilisation. Ou vous utilisez simplement à la dirdiffplace, ce qui est destiné à ce que vous essayez! :-)

Mais si vous souhaitez synchroniser certains répertoires, vous devriez vraiment y jeter un œil rsync.

Cordialement

Jan.
la source
3

Si vous souhaitez également le faire dans tous les sous-répertoires, une bonne façon de le faire est:

diff --brief -r dir1/ dir2/

Je préfère utiliser le brief, mais vous pouvez laisser cela de côté si vous le souhaitez.

trueCamelType
la source
1

for i in $(ls -1 directory1); do if (test -f directory2/$i) then echo $i; fi; done

James L
la source
0

Cela marche..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
Warner
la source
0

non testé:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
Javier
la source
0

Dennis Williamson avait une bonne réponse , mais je devais le faire récursivement. GNU findutils 4.7.0 ne trie pas sa sortie, voici donc ce que j'ai utilisé

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort)

Pour ce faire d'une seule façon et produire une liste de fichiers, j'ai utilisé ceci:

diff <(cd $dir1; find | sort) <(cd $dir2; find | sort) \
| grep '< ./' | sed "s,< ./,$dir1/,"

Pour que cela fonctionne correctement, ni $ dir1 ni $ dir2 ne doivent inclure la barre oblique de fin.

sondra.kinsey
la source