Mam dwa katalogi, które powinny zawierać te same pliki i tę samą strukturę katalogów.
Myślę, że czegoś brakuje w jednym z tych katalogów.
Czy korzystając z powłoki bash istnieje sposób na porównanie moich katalogów i sprawdzenie, czy w jednym z nich brakuje plików znajdujących się w drugim?
command-line
AndreaNobili
źródło
źródło
bash --version
?Odpowiedzi:
Dobrym sposobem na to porównanie jest użycie
find
zmd5sum
, a następnie adiff
.Przykład
Użyj polecenia find, aby wyświetlić listę wszystkich plików w katalogu, a następnie obliczyć skrót md5 dla każdego pliku i potokować go posortowanym według nazwy pliku do pliku:
Wykonaj tę samą procedurę w innym katalogu:
Następnie porównaj wynik dwóch plików z
diff
:Lub jako pojedyncze polecenie przy użyciu podstawienia procesu:
Jeśli chcesz zobaczyć tylko zmiany:
Polecenie cięcia drukuje tylko skrót (pierwsze pole) do porównania przez diff. W przeciwnym razie diff wypisze każdą linię, ponieważ ścieżki katalogu różnią się, nawet jeśli skrót jest taki sam.
Ale nie będziesz wiedział, który plik się zmienił ...
W tym celu możesz spróbować czegoś takiego
Ta strategia jest bardzo przydatna, gdy dwa katalogi, które mają być porównywane, nie znajdują się na tym samym komputerze i musisz upewnić się, że pliki są równe w obu katalogach.
Innym dobrym sposobem na wykonanie zadania jest użycie
diff
polecenia Gita (może powodować problemy, gdy pliki mają różne uprawnienia - wtedy każdy plik jest wyświetlany na wyjściu):źródło
find
pliki będą wyświetlane na liście, będzie się zasadniczo różnić między dwoma katalogami.Możesz użyć
diff
polecenia tak samo, jak w przypadku plików:Jeśli chcesz zobaczyć także podfoldery i pliki, możesz użyć
-r
opcji:źródło
diff
działa również dla katalogów (potwierdził to man diff), ale to nie rekurencyjnie sprawdza zmiany w podkatalogach wewnątrz podkatalogów.a/b/c/d/a
,x/b/c/d/b
. Zobacz, codiff a x
ci daje.-r
opcji. To (diff -r a x
) daje mi:Only in a/b/c/d: a. only in x/b/c/d: b.
Poprzez nie używasz bash, można to zrobić przy użyciu diff z
--brief
i--recursive
:man diff
Zawiera obie opcje:źródło
Oto alternatywa, aby porównać tylko nazwy plików, a nie ich zawartość:
Jest to prosty sposób na wyświetlenie listy brakujących plików, ale oczywiście nie wykryje plików o tej samej nazwie, ale o innej zawartości!
(Osobiście używam własnego
diffdirs
skryptu, ale jest to część większej biblioteki ).źródło
diff
nie obsługuje obecnie. Ale jest to,comm
co obsługuje go od czasu git.savannah.gnu.org/cgit/coreutils.git/commit/…, więc jeśli dojdzie do coreutils w pobliżu, możesz to zrobićcomm -z <(cd folder1 && find -print0 | sort) <(cd folder2 && find -print0 | sort -z)
(którego wyniki możesz być zmuszone do dalszej konwersji w formacie musisz użyć--output-delimiter
parametru i dodatkowych narzędzi).Być może jedną z opcji jest uruchomienie rsync dwa razy:
W poprzednim wierszu otrzymasz pliki, które znajdują się w katalogu 1 i są inne (lub ich brakuje) w katalogu 2.
To samo dotyczy dir2
Możesz usunąć
-n
opcję przejścia zmian. To jest kopiowanie listy plików do drugiego folderu.Jeśli to zrobisz, być może dobrym rozwiązaniem jest użycie
-u
, aby uniknąć zastąpienia nowszych plików.Jednowarstwowy:
źródło
Jeśli chcesz, aby każdy plik był rozwijany i zwijany, możesz przesłać dane wyjściowe
diff -r
do Vima.Najpierw dajmy Vimowi zasadę składania:
Teraz tylko:
Możesz uderzać
zo
izc
otwierać i zamykać fałdy. Aby wyjść z Vima, naciśnij:q<Enter>
źródło
Dość łatwe zadanie do wykonania w pythonie:
Zastąp rzeczywiste wartości dla
DIR1
iDIR2
.Oto przykładowy przebieg:
Dla czytelności, oto rzeczywisty skrypt zamiast jednowierszowego:
źródło
os.listdir
nie daje żadnej określonej kolejności. Tak więc listy mogą mieć te same rzeczy w innej kolejności i porównanie się nie powiedzie.Zainspirowany odpowiedzią Sergiy napisałem własny skrypt Pythona, aby porównać dwa katalogi.
W przeciwieństwie do wielu innych rozwiązań nie porównuje zawartości plików. Nie wchodzi też do podkatalogów, których brakuje w jednym z katalogów. Wynik jest więc dość zwięzły, a skrypt działa szybko z dużymi katalogami.
Jeśli zapiszesz go w pliku o nazwie
compare_dirs.py
, możesz go uruchomić za pomocą Python3.x:Przykładowe dane wyjściowe:
PS Jeśli chcesz porównać rozmiary plików i skróty plików pod kątem potencjalnych zmian, opublikowałem zaktualizowany skrypt tutaj: https://gist.github.com/amakukha/f489cbde2afd32817f8e866cf4abe779
źródło
cmpdirs dir1 dir2 '/\.git/'
Dodam do tej listy alternatywę dla NodeJ, którą napisałem jakiś czas temu.
reż-porównaj
źródło
Chciałbym zaproponować świetne narzędzie, które właśnie odkryłem: MELD .
Działa poprawnie i wszystko, co możesz zrobić za pomocą polecenia
diff
w systemie Linux, można tam replikować za pomocą ładnego interfejsu graficznego! Cieszyć sięźródło