Chcę uruchomić polecenie systemu Linux, które rekurencyjnie porównuje dwa katalogi i wyświetli tylko nazwy plików tego, co jest inne. Obejmuje to wszystko, co jest obecne w jednym katalogu, a nie w drugim lub odwrotnie, oraz różnice w tekście.
linux
command-line
diff
barfoon
źródło
źródło
diff
strona podręcznika w CentOS 7 opisuje-q
jako „raportuj tylko wtedy, gdy pliki się różnią”, co jest mniej jasne niż to, co napisałeś.-x PATTERN
w poleceniu wykluczenie niektórych podkatalogów. Na przykładdiff -qr repo1 repo2 -x ".git"
porówna dwa katalogi, ale wykluczy ścieżki plików z „.git” w nich.Możesz także użyć rsync
źródło
--size-only
będzie brakować plików o identycznym rozmiarze, ale różnej zawartości, np. stary / wersja.txt „29a” nowy / wersja.txt „29b” . Zamiast tego użyj:rsync -ric --dry-run old/ new/
gdzie argument „-i” pozwala uzyskać listę plików bezpośrednio przezrsync -ric --dry-run old/ new/ | cut -d" " -f 2
Jeśli chcesz uzyskać listę plików znajdujących się tylko w jednym katalogu, a nie ich podkatalogów i tylko ich nazwy:
Jeśli chcesz rekurencyjnie wyświetlić listę wszystkich plików i katalogów, które różnią się ich pełnymi ścieżkami:
W ten sposób możesz zastosować różne polecenia do wszystkich plików.
Na przykład mogę usunąć wszystkie pliki i katalogi znajdujące się w katalogu 1, ale nie w katalogu 2:
źródło
W moim systemie Linux, aby uzyskać tylko nazwy plików
źródło
audit-0.0.234/audit-data-warehouse-0.0.234/ audit-0.0.235/audit-data-warehouse-0.0.235/
diff -qrN /dir1 /dir2 | cut -f2 -d' '
działa dobrze dla mnie!Podejście do uruchamiania
diff -qr old/ new/
ma jedną poważną wadę: może brakować plików w nowo utworzonych katalogach. Np. W poniższym przykładzie plikudata/pages/playground/playground.txt
nie ma na wyjściu,diff -qr old/ new/
podczas gdy katalogdata/pages/playground/
jest (wyszukaj playground.txt w przeglądarce aby szybko porównać). Opublikowałem również następujące rozwiązanie na giełdzie stosów Unix i Linux , ale skopiuję je również tutaj:Aby utworzyć listę nowych lub zmodyfikowanych plików programowo najlepszym rozwiązaniem, jakie mogłem wymyślić, jest użycie rsync , sort i uniq :
Pozwól mi wyjaśnić za pomocą tego przykładu: chcemy porównać dwie wersje dokuwiki, aby zobaczyć, które pliki zostały zmienione, a które nowo utworzone.
Ściągamy smoły za pomocą wget i wyodrębniamy je do katalogów
old/
inew/
:Uruchamianie rsync w jedną stronę może spowodować pominięcie nowo utworzonych plików, ponieważ porównanie rsync i diff pokazuje tutaj:
daje następujące dane wyjściowe:
Uruchomienie rsync tylko w jednym kierunku powoduje pominięcie nowo utworzonych plików, a na odwrót pominięcie usuniętych plików, porównanie danych wyjściowych diff:
daje następujące dane wyjściowe:
Uruchomienie rsync na dwa sposoby i sortowanie danych wyjściowych w celu usunięcia duplikatów ujawnia, że katalog
data/pages/playground/
i plikdata/pages/playground/playground.txt
zostały początkowo pominięte:daje następujące dane wyjściowe:
rsync
jest uruchamiany z tymi argumentami:-r
„przekierowywać do katalogów”,-c
aby porównać również pliki o identycznym rozmiarze i tylko „pomiń na podstawie sumy kontrolnej, a nie czasu i rozmiaru mod”,-n
„wykonać jazdę próbną bez zmian”, oraz--out-format="%n"
do „wypisywania aktualizacji za pomocą określonego FORMATU”, czyli „% n” tutaj tylko dla nazwy plikuDane wyjściowe (lista plików)
rsync
w obu kierunkach są łączone i sortowane za pomocąsort
, a ta posortowana lista jest następnie zagęszczana poprzez usunięcie wszystkich duplikatów za pomocąuniq
źródło
diff new/ old/
), aby zobaczyć, które katalogi zostały usunięte?diff -qr new/ old/
na powyższym przykładzie ze smoły dokuwiki produkuje taką samą moc jakdiff -qr old/ new/
- czyli widać, że katalog jest nowy / brakujące pliki, ale nie w niejźródło