Próbuję znaleźć pliki istniejące w jednym katalogu, ale nie w drugim, próbowałem użyć tego polecenia:
diff -q dir1 dir2
Problem z powyższym poleceniem polegającym na tym, że znajduje on zarówno pliki w, dir1
ale nie w, dir2
jak również pliki w, dir2
ale nie w dir1
,
Próbuję znaleźć pliki, dir1
ale nie dir2
tylko.
Oto mała próbka tego, jak wyglądają moje dane
dir1 dir2 dir3
1.txt 1.txt 1.txt
2.txt 3.txt 3.txt
5.txt 4.txt 5.txt
6.txt 7.txt 8.txt
Kolejne pytanie, jakie mam na myśli, to w jaki sposób mogę znaleźć pliki w jednym poleceniu, dir1
ale nie w nim dir2
lub dir3
w jednym poleceniu?
grep
do czegoś jak^dir1
upewnić się, że nie dostaćdir1
pojawiające się później w ścieżce.$4
jako przykładu. W rzeczywistości na moim rzeczywistym Ubuntudiff
odpowiada w języku włoskim.$4
jest w porządku dla odpowiedzi w języku włoskim i angielskim, ale nie jestem pewien co do wszystkich innych języków ...To powinno wykonać zadanie:
Opcje wyjaśnione (przez diff (1) strony man ):
-r
- Rekurencyjnie porównaj wszystkie znalezione podkatalogi.-q
- Wyprowadzaj tylko, czy pliki się różnią.źródło
diff -rq dir1 dir2 | grep 'Only in dir1/'
-q
opcji: Strony podręcznika mówią tylko „Wypisuj tylko, czy pliki się różnią”, a nie to, jak sprawdza, czy są one różne. Przejrzałem kod źródłowy i odkryłem, że sprawdza on tylko rozmiary plików w celu ustalenia różnic, a nie rzeczywistej zawartości.-q
opcję, nie mogę odtworzyć, że sprawdza ona tylko rozmiar pliku. Używanie GNU Diffutils 3.7 porównując dwa pliki o tym samym rozmiarze, ale z inną zawartością z danymidiff -q file1 file2
wyjściowymiFiles file1 and file2 differ
.To polecenie da ci pliki, które znajdują się w katalogu 1, a nie w katalogu 2.
O
<( )
znaku możesz google jako „proces podstawienia”.źródło
(ls -R dir1|sort)
może załatwić(ls -R dir|sort)
.vimdiff <(ls dir1 |sort) <(ls dir2|sort)
Dobrym sposobem na dokonanie tego porównania jest użycie
find
zmd5sum
, a następnie adiff
.Przykład:
Użyj,
find
aby wyświetlić listę wszystkich plików w katalogu, a następnie obliczyć skrót md5 dla każdego pliku i potokować go do pliku:Wykonaj tę samą procedurę w innym katalogu:
Następnie porównaj wynik dwóch plików z „diff”:
Ta strategia jest bardzo przydatna, gdy dwa katalogi, które mają być porównywane, nie znajdują się na tej samej maszynie i musisz upewnić się, że pliki są równe w obu katalogach.
Innym dobrym sposobem na wykonanie tej pracy jest użycie git
Z poważaniem!
źródło
Meld ( http://meldmerge.org/ ) świetnie sobie radzi w porównywaniu katalogów i plików w nich zawartych.
źródło
Wtyczka DirDiff vima to kolejne bardzo przydatne narzędzie do porównywania katalogów.
Nie tylko wyświetla listę plików, które różnią się między katalogami, ale pozwala także na inspekcję / modyfikację za pomocą vimdiff różnych plików.
źródło
Niezadowolony ze wszystkich odpowiedzi, ponieważ większość z nich działa bardzo wolno i generuje niepotrzebnie długie dane wyjściowe dla dużych katalogów, napisałem własny skrypt Pythona, aby porównać dwa foldery.
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 innym katalogu. Wynik jest więc dość zwięzły, a skrypt działa szybko.
Przykładowe użycie:
Lub jeśli chcesz zobaczyć tylko pliki z pierwszego katalogu:
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
Inne podejście (być może szybsze w przypadku dużych katalogów):
sed
Polecenie usuwa pierwszy składnik katalog dzięki Erik`s postu )źródło
find
stąd komentarza, a nie oddzielnej odpowiedzi):cd dir2; find . -exec [ -e ../dir1/{} ] \; -o -print 2>/dev/null
Spowoduje to wydrukowanie plików obecnych w katalogu 2, ale nie obecnych w katalogu 1.Jest trochę późno, ale może komuś pomóc. Nie jestem pewien, czy diff lub rsync wyrzucają tylko nazwy plików w takim formacie. Dzięki plhn za udostępnienie tego fajnego rozwiązania, które rozwinąłem poniżej.
Jeśli chcesz tylko nazwy plików, aby łatwo było skopiować potrzebne pliki w czystym formacie, możesz użyć polecenia find.
Zakłada się, że zarówno katalog 1, jak i katalog 2 znajdują się w tym samym folderze nadrzędnym. sed po prostu usuwa folder nadrzędny, aby można było porównać jabłka z jabłkami. Ostatni sed po prostu przywraca nazwę katalogu 1.
Jeśli chcesz tylko pliki:
Podobnie w przypadku katalogów:
źródło
cd
przed,find
zamiast korzystaćsed
npcomm -23 <(cd dir1 || exit; find -type f | sort) <(cd dir2 || exit; find -type f | sort)
. : . (exit
S są tutaj, aby uniemożliwićfind
korzystanie z bieżącego katalogu powinno sięcd
nie powieść.)comm
z obsługą-z
(dostarczoną z git.savannah.gnu.org/cgit/coreutils.git/commit/… ), co możesz zrobićcomm -23 -z <(cd dir1 && find -type f -print0 | sort -z) <(cd dir2 && find -type f -print0 | sort -z)
. (W międzyczasie też zorientowałem się, żeexit
można je wymienić.)Akceptowana odpowiedź wyświetli również listę plików, które istnieją w obu katalogach, ale mają inną zawartość. Aby wyświetlić WYŁĄCZNIE pliki istniejące w katalogu 1, możesz użyć:
Wyjaśnienie:
źródło
Ta odpowiedź optymalizuje jedną z sugestii @ Adail-Junior, dodając
-D
opcję, która jest przydatna, gdy żaden z porównywanych katalogów nie jest repozytoriami git:Jeśli użyjesz
-D
, nie zobaczysz porównań z/dev/null
:text Binary files a/whatever and /dev/null differ
źródło
Uproszczony sposób porównywania 2 katalogów za pomocą polecenia DIFF
otwórz filename.dat po zakończeniu uruchomienia
i zobaczysz: Tylko w nazwie pliku 1: Nazwa pliku 2 Tylko w: nazwa_katalogu: nazwa_pliku1 Tylko w: nazwa_katalogu: nazwa_pliku2
źródło
To jest skrypt bash do drukowania poleceń do synchronizacji dwóch katalogów
źródło
GNU
grep
może odwrócić wyszukiwanie z opcją-v
. To sprawia, żegrep
zgłaszanie wierszy, które nie pasują. W ten sposób możesz usunąć plikidir2
z listy plików wdir1
.Opcje
-F -x
powiedziećgrep
, aby przeprowadzić wyszukiwanie tekstu na całej linii.źródło