Suchen Sie Dateien in einem Verzeichnis, nicht in einem anderen

12

Gibt es Linux / Unix-Tools, die alle Dateien in einem Verzeichnis finden, die in einem anderen nicht vorhanden sind? Grundsätzlich suche ich diff, das auf der Ausgabe von ls funktioniert.

Kurze und süße Skripte werden ebenfalls geschätzt.

Willi Ballenthin
quelle

Antworten:

20

diff macht das schon:

diff dir1 dir2

Beispielausgabe:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt
Tobym
quelle
5
Das ist gut. Ein Kritikpunkt: diff wird tatsächlich für jede der Dateien ausgeführt, die sich in beiden befinden. Gibt es eine obskure Option, um nur gegen Dateinamen zu laufen (ich habe sie möglicherweise verpasst)? Ansonsten schlage ich vordiff dir1 dir2 | grep "Only"
Willi Ballenthin
wow das spart mir nur viele Minuten Bash-Scripting danke
user5359531
10

Bash:

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

Vergleichen Sie nur die Dateinamen - nicht den Inhalt der Dateien.

Bis auf weiteres angehalten.
quelle
Auch ksh und zsh.
Bis auf weiteres angehalten.
Verwenden Sie rsync für Synchronisierungsverzeichnisse
c4f4t0r
Nicht analysieren ls, findsondern verwenden!
Val sagt Reinstate Monica
4

Wie Ihnen hier bereits gesagt wurde, können Sie DIFF in verschiedenen Nutzungsvarianten verwenden. Oder Sie verwenden dirdiffstattdessen einfach , was für das gedacht ist, was Sie versuchen! :-)

Aber wenn Sie einige Verzeichnisse synchron halten möchten, sollten Sie sich das unbedingt ansehen rsync.

Grüße

Jan.
quelle
3

Wenn Sie dies auch in allen Unterverzeichnissen tun möchten, ist dies eine gute Möglichkeit:

diff --brief -r dir1/ dir2/

Ich bevorzuge die Verwendung von Brief, aber Sie können das weglassen, wenn Sie wollen.

trueCamelType
quelle
1

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

James L.
quelle
0

Das funktioniert..

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

ungetestet:

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

Dennis Williamson hatte eine gute Antwort , aber ich musste dies rekursiv tun. GNU findutils 4.7.0 sortiert seine Ausgabe nicht, daher habe ich Folgendes verwendet

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

Um dies nur in eine Richtung zu tun und eine Liste von Dateien zu erstellen, habe ich Folgendes verwendet:

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

Damit dies ordnungsgemäß funktioniert, sollten weder $ dir1 noch $ dir2 den abschließenden Schrägstrich enthalten.

sondra.kinsey
quelle