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.

Willi Ballenthin
źródło

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
tobym
źródło
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
10

Grzmotnąć:

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

Porównaj tylko nazwy plików - nie zawartość plików.

Wstrzymano do odwołania.
źródło
Również ksh i zsh.
Wstrzymano do odwołania.
użyj rsync do synchronizacji katalogów
c4f4t0r
Nie analizuj ls, użyj findzamiast tego!
val mówi Przywróć Monikę
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

Stycznia
źródło
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.

trueCamelType
źródło
1

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

James L.
źródło
0

To działa..

ls -a1 /dir1 | sort > /tmp/1
ls -a1 /dir2 | sort > /tmp/2
diff /tmp/1 /tmp/2
Warner
źródło
0

niesprawdzone:

find /dir/A -printf "%P" | while read f; do
  if [ ! -e "/dir/B/$f" ]; then
    echo $f
  fi
done
Javier
źródło
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.

sondra.kinsey
źródło