Znajdź pliki w jednym katalogu, a nie w innym


12

Czy istnieją narzędzia dla systemu Linux / Unix, w których wszystkie pliki w jednym katalogu nie występują w innym? Zasadniczo szukam diff, który działa na wyjściu ls.

Doceniane są także krótkie i słodkie skrypty.

Odpowiedzi:


20

diff robi to już:

diff dir1 dir2

Przykładowe dane wyjściowe:

Only in dir1: some_file.txt
Only in dir1: some_other_file.txt
Only in dir2: third_file.txt

5
To jest dobre. Jeden problem: diff faktycznie działa na każdym z plików, które są w obu. Czy jest jakaś niejasna opcja, aby po prostu uruchomić się przeciwko nazwom plików (mogłem to przegapić)? W przeciwnym razie sugerujędiff dir1 dir2 | grep "Only"
Willi Ballenthin

wow, po prostu zaoszczędź mi wiele minut dzięki
skryptom


4

Jak ludzie ci tutaj mówili, możesz używać DIFF w różnych wariantach użytkowania. Lub po prostu użyj dirdiffzamiast tego, co jest przeznaczone do tego, czego próbujesz! :-)

Ale jeśli chcesz zachować synchronizację niektórych katalogów, naprawdę powinieneś się przyjrzeć rsync.

pozdrowienia


3

Jeśli chcesz to zrobić również we wszystkich podkatalogach, dobrym sposobem na to jest:

diff --brief -r dir1/ dir2/

Wolę używać skrótu, ale możesz to pominąć, jeśli chcesz.


1

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


0

To działa..

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

0

niesprawdzone:

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

0

Dennis Williamson miał dobrą odpowiedź , ale musiałem to zrobić rekurencyjnie. GNU findutils 4.7.0 nie sortuje danych wyjściowych, więc oto, czego użyłem

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

Aby to zrobić tylko w jeden sposób i stworzyć listę plików, użyłem tego:

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

Aby to działało poprawnie, ani $ dir1, ani $ dir2 nie powinny zawierać ukośnika końcowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.