Biorąc pod uwagę bash, może to być najłatwiejsze jako
$ comm <(ls -a dir1) <(ls -a dir2)
W <(command)
biegnie ekspresyjnych dowodzenia na rurą i podstawia /dev/fd
odniesienia:
mress:10018 Z$ echo <(ls)
/dev/fd/11
Tak więc powyższe polecenie jest uruchamiane ls -a
w każdym katalogu i przekazuje swoje wyniki jako argumenty pliku do comm
, w wyniku czego do 3 kolumn, z wcięciem: wpisy tylko w pierwszym, wpisy w obu, wpisy w drugim. (To znaczy, jeśli jest w obu, to jest wcięty tabulatorem, jeśli jest tylko w drugim, jest wcięty 2 tabulatorami.) Możesz także pomijać kolumny według liczb: comm -1 foo bar
wyświetla tylko linie w obu i linie w drugim pliku, ten ostatni jest wcięty przez jedną kartę. (Jest to najczęściej używane przez pomijanie wszystkich oprócz żądanej kolumny: comm -13 foo bar
pokazuje tylko wspólne linie).
Biorąc pod uwagę, że chcesz te w pierwszym katalogu, to znaczy
$ comm -23 <(ls -a dir1) <(ls -a dir2)
Jeśli potrzebujesz czegoś więcej niż tylko tego, czy jest obecny, użyj diff -r
, który wyświetli różnice dla wspólnych plików i jednowierszowy komunikat dla plików znalezionych tylko w jednym lub drugim.
ls
pojawią się wszystkie problemy z białymi spacjami, tabulatorami, liniami, odstępami i tak dalej w nazwach plików.ls -b
.find
. Ale moim głównym zarzutemfind
jest to, że to naprawdę ciężki młot do uderzenia, co zwykle jest raczej małą muchą.A tutaj czysty skrypt. Są to katalogi aib:
Oto polecenie:
wynik:
Zamień a i b dla plików w, ale nie w b. The! jest negacją. -e testy na -existance. In prosa: „Test, jeśli nie istnieje, plik znaleziony w …/b”.
Uwaga: Musisz zanurzyć się w pierwszym, aby uzyskać nazwy bez „a”. Do drugiego porównania musisz cd
../b
.źródło
Jeśli wolisz narzędzie graficzne, użyj
być może trzeba go najpierw zainstalować. Podobne programy są
Dowódca północy ma wbudowane
compare directories
polecenie, które działa dobrze, jeśli nie wybierasz podkatalogów.źródło
Możesz użyć zaniedbanego
join
polecenia. Oto niektóre ustawienia dla dwóch przykładowych katalogów, d1 / i d2 /, z których każdy ma niektóre pliki o nazwach unikatowych dla katalogu i niektóre pliki o nazwach wspólnych z innym katalogiem. To tylko przykład, więc użyłem jednoliterowych nazw plików, aby zilustrować nazwy plików unikatowe dla jednego lub drugiego i wspólne nazwy plików.Dla mnie pokazuje takie pliki:
AKTUALIZACJA: Chciałbyś robić różne rzeczy w prawdziwym życiu, aby dostosować pliki z białymi spacjami, ponieważ
join
używa pierwszego pola „rozdzielanego białymi spacjami”, aby zdecydować, które linie są unikalne, a które wspólne.źródło
join -t ''
(bez separatora) pomogłoby w tej sprawie.d2/f
aled2/f
. Karty i znaki nowej linii w nazwach plików są rzadkie, ale dozwolone.Możesz to wykorzystać
find
iawk
rozwiązać.Z następującym układem:
Część pierwsza:
Część druga:
W porównaniu z
comm
rozwiązaniem:I do
join
rozwiązania:źródło
użyj moich funkcji:
źródło