Jaki jest najlepszy i najprostszy sposób porównania dwóch struktur katalogów bez faktycznego porównywania danych w plikach? Działa to dobrze:
diff -qr dir1 dir2_
Ale jest bardzo powolny, ponieważ porównuje również pliki. Czy jest do tego dostępny przełącznik diff lub inne proste narzędzie cli?
linux
comparison
Jonasz
źródło
źródło
-type d
opcję z odpowiedzi @ slartibartfast lub sprawdzić moją odpowiedź.Odpowiedzi:
Następujące czynności (jeśli podstawisz pierwszy katalog na katalog1, a drugi na katalog2), powinny zrobić to, czego szukasz i szybko:
Podstawową zasadą jest to, że drukuje wszystkie katalogi, w tym ścieżki podkatalogów względem katalogu bazowego kataloguN.
Może to upaść (produkować dziwne dane wyjściowe), jeśli masz zwroty karetki w niektórych nazwach katalogów, ale nie w innych.
źródło
diff -rq
tylko pokazuje katalog główny istnieje w jednym i kontynuuje.da Ci przyjemne wyświetlanie obok siebie dwóch hierarchii katalogów ze złożonymi wszystkimi popularnymi sekcjami.
źródło
Zwykle używam
rsync
do tego zadania:BĄDŹ BARDZO OSTROŻNY, aby zawsze używać opcji
-n
aka--dry-run
, ponieważ spowoduje to synchronizację (zmianę zawartości) katalogów.Spowoduje to porównanie plików na podstawie czasów i rozmiarów modyfikacji plików ... Myślę , że tego naprawdę chcesz, a przynajmniej nie masz nic przeciwko, jeśli to zrobi? Mam wrażenie, że po prostu chcesz, aby stało się to szybciej , a nie że musisz ignorować różnicę między zawartością pliku. Jeśli chcesz, aby nie wyświetlał różnych plików o identycznych nazwach, myślę, że dodanie tej
--ignore-existing
opcji to zrobi.Również należy pamiętać, że nie wstawiając
/
na końcuDIR1
spowoduje to porównanie kataloguDIR1
z zawartością oDIR2
.Dane wyjściowe są nieco szczegółowe, ale pokażą, które pliki / katalogi różnią się. Pliki / katalogi obecne w,
DIR2
a nie w,DIR1
będą poprzedzone słowemdeleting
.W niektórych sytuacjach odpowiedź @ slartibartfast może być bardziej odpowiednia, chociaż musisz usunąć
-type d
opcję, aby włączyć wyświetlanie plików spoza katalogu.rsync
będzie szybszy, jeśli masz znaczną liczbę plików / katalogów do porównania.źródło
deleting...
tekst, ale prawdopodobnie jest to jeden z lepszych sposobów porównywania plików przy jednoczesnym zachowaniu szybkości. Inne odpowiedzi tutaj są szybsze, gdy różnicowanie plików nie jest wymagane ... jak w przykładzie OP, ale naprawdę podoba mi się ten.sudo -u nobody rsync -nav --delete d1 d2
pod warunkiem, że flagi dla „innych” pozwalają na czytanie.Podobne do odpowiedzi ls, ale jeśli zainstalujesz drzewo , możesz
źródło
diff <( tree dir1 ) <( tree dir2 )
i
flagą, która nie drukuje linii drzewa (tree -i dir1
itp.). Jeśli struktura katalogów jest inna w jednym miejscu, inne pasujące pliki mogą mieć więcej lub mniej|
symboli w danych wyjściowych drzewa, a diff przechwyci te linie, nawet jeśli ścieżki plików są identyczne.Po prostu szukałem rozwiązania tego problemu. Najbardziej podobało mi się:
Daje ci 3 kolumny: 1 - pliki tylko w DIR1, 2 - pliki tylko w DIR2, 3 - pliki tylko w DIR3 Aby uzyskać więcej informacji, zobacz ten post na blogu.
źródło
DIR3
określony? Widzę tylkoDIR1
iDIR2
.DIR1
w kolumnie 1 , wszystkie pliki tylko wDIR2
w kolumnie 2 , a wszystkie pliki udostępnione przez zarówno w kolumnie 3 . To trochę użyteczne, ale czy wiesz, jak można usunąć kolumnę 3 i pozostawić tylko różnice? Mam wiele plików do posortowania, a większość z nich jest identyczna. Nie muszę widzieć, co jest takie samo.comm <(ls DIR1) <(ls DIR2)
nie działa rekurencyjnie. Do tego użyłemcomm <(ls -R1 DIR1) <(ls -R1 DIR2)
.ls -R
przeszukuje katalogi rekurencyjnie ils -1
(zauważ, że to jest jeden , a nie L ) sprawia, żels
drukuje tylko jedną nazwę pliku w linii.comm -3
(patrzman comm
).Następnie różnicuj dwie listy.
źródło
To optymalne rozwiązanie
- krótki przełącznik informuje tylko, czy pliki się różnią, a nie szczegóły różnicy.
źródło
-q
w pytaniu, które jest pseudonimem--brief
. Ta odpowiedź nie zawiera żadnych nowych informacji.But it's really slow because it's comparing files too.
użyj „diff -qr”, aby pobrać różne pliki, a następnie odfiltruj porównanie plików z grep, aby uzyskać tylko nazwy plików, które są tylko w jednym z katalogów.
źródło
Działa to z moją konkretną potrzebą znalezienia brakujących plików w drzewach, które powinny pasować.
źródło
Myślę, że tylko rsync jest użyteczny. dlaczego?
diff jest użyteczny tylko dla struktur przechowujących pliki i katalogi. Diff nie podaje odpowiednich kodów wyjścia, gdy używamy dowiązań symbolicznych. W takiej sytuacji diff może zwrócić 2 kody wyjścia, nawet jeśli src i dst są identyczne (czasy, rozmiary, nazwy, znaczniki czasu, wskazywanie softlinków itp.).
reż, system plików nie gwarantuje porządkowania plików, nawet jeśli zawartość katalogu na src i dst jest identyczna. Może powinieneś przefiltrować wyjście ls, sortując je. Ale czysty ls wyświetla tylko nazwy węzłów.
być może skrypt zawierający diff, cmp, test -X dla typów węzłów będzie przydatny, ale pamiętaj o przeciążeniu spowodowanym przez wiele testów / cmp. Skrypt będzie bardzo wolny.
Jak zwykle, jeśli chcesz uzyskać proste informacje „katalog jest / nie jest identyczny”, powinieneś użyć rsync z opcją -n (sucha). Jeśli chcesz dowiedzieć się, co jest inne, użyj polecenia diff.
źródło