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.

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

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


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


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.


1

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


0

Cela marche..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2

0

non testé:

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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.