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.

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

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


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


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.


1

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


0

Das funktioniert..

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

0

ungetestet:

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.