Czy istnieje folder MD5 (lub podobny) do folderu? Jak sprawdzić, czy dwa foldery są równe?

10

Chciałbym znaleźć md5sum(lub podobne obliczenie) folderu bez kompresji go do archiwum.

Na przykład, jeśli w folderze MyFoldermamy pliki 1.txt, 2.txti 3.txtzawierający:


1.txt

Tekst do 1.txt

2.txt

Tekst do 2.txt

3.txt

Tekst do 3.txt


Jak mogę obliczyć md5sumcałość MyFolder? Czy jest jakiś sposób? Chcę tego użyć, aby sprawdzić, czy dwa foldery mają tę samą zawartość.

Można to wykorzystać do sprawdzenia, czy dwa dyski CD lub foldery są równe. Chciałbym w łatwy sposób to zrobić.

GarouDan
źródło

Odpowiedzi:

15

Md5deep narzędzie zostało opracowane dla tego właśnie celu. Wiele dystrybucji Linuksa oferuje to w formie pakietu.

David Schwartz
źródło
1
Dzięki! Dla mnie to zadziałało. Do innych użytkowników, którzy mają ten sam problem, lubią to: Bardzo sudo apt-get install md5deep md5deep -rel /path/to/your/directory/ > directory_hash.md5 md5deep -X directory_hash.md5 -r /path/to/your/second/direcotory dziękuję.
GarouDan
@GarouDan. Polecenie, które pokazałeś, będzie podążać za dowiązaniami symbolicznymi. Możesz użyć tej -oopcji do obsługi typów plików.
Peter.O
Och, dziękuję ... nie wiem tego ... naprawdę pomocny. Zapamiętam!
GarouDan
4

Jeśli nie chcesz go archiwizować, być może możesz zrobić coś takiego

diff <(find folder1) <(find folder2)

Być może będziesz musiał dostosować findpolecenia, aby były bardziej dokładne.

EDYCJA Możesz dodać -execdo swojego wywołania find, aby porównać zawartość plików. Coś podobnego do tego:

diff <(find folder1 -type f -exec md5sum {} \; | sort) <(find folder2 -type f -exec md5sum {} \; | sort)

Pamiętaj, że możesz to dostosować.

rahmu
źródło
To interesujący punkt. Zawiera listę wszystkich plików z każdego folderu ... ale jeśli mam naprawdę dużo archiwów ... jak mogę sprawdzić, czy w każdym folderze znajdują się te same pliki (z danymi - być może przy użyciu narzędzia md5sum)?
GarouDan
1
Następnie wykonaj różnicę wyjściową MD5SUM każdego pliku. Trzeba po prostu inaczej połączyć polecenia find, md5sum i diff.
sybreon
Dziękuję też za twoje pomysły, cya ... Spróbuję ciekawych rzeczy z tymi poleceniami znajdowania po ... dzięki.
GarouDan
3

Jednym ze sposobów przetestowania może być wygenerowanie sumy md5 na podstawie konkatenacji wszystkich plików w folderze i jego podfolderach. Pamiętaj, że wymaga to również, aby pliki miały te same nazwy (ponieważ muszą być w tej samej kolejności sortowania). Powinien działać następujący kod:

#!/bin/bash

shopt -s nullglob
shopt -s globstar || { printf '%s\n' 'Bash 4 is required for globstar.' ; exit 1 ; }
(( $# == 2 )) || { printf '%s\n' "Usage: ${0##*/} olddir newdir" ; exit 2 ; }

for _file in "$1"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_old_dir+=( "${_file}" ); done
for _file in "$2"/**/*; do [[ -f ${_file} && ! -L ${_file} ]] && _files_in_new_dir+=( "${_file}" ); done

(( ${#_files_in_old_dir[@]} )) || { printf '%s\n' 'No files in old dir.' ; exit 3 ; }
(( ${#_files_in_new_dir[@]} )) || { printf '%s\n' 'No files in new dir.' ; exit 4 ; }

_md5_old_dir=$(cat "${_files_in_old_dir[@]}" | md5sum)
_md5_new_dir=$(cat "${_files_in_new_dir[@]}" | md5sum)

{ [[ ${_md5_old_dir} == "${_md5_new_dir}" ]] && (( ${#_files_in_old_dir[@]} == ${#_files_in_new_dir[@]} )) ; } && printf '%s\n' 'Folders are identical.' || { printf '%s\n' 'Folders are not identical.' ; exit 3 ; }

Jeśli naprawdę zależy Ci na nazwach plików itp., Możesz użyć pętli do porównania tego, co jest w ${_files_in_old_dir}i ${_files_in_new_dir}. Powinno to działać w większości przypadków (przynajmniej sprawdza liczbę plików w katalogu i jego podkatalogach).

Chris Down
źródło
To fajny skrypt ... dzięki @Chris. Ale ma problem ... używając cat , podfoldery ulegają awariom z błędami ... Czy masz pomysł, aby go rozwiązać? Wielkie dzięki.
GarouDan
Działa dla mnie dobrze. Upewnij się, że twoja powłoka obsługuje globstar. Jaki jest błąd?
Chris Down,
1
„Działa” (+1) ... ale globstar w bash 4 podąża za dowiązaniami symbolicznymi katalogów , ale to tylko problem, jeśli którykolwiek katalog zawiera dowiązania symboliczne.
Peter.O
@fered Dobra rozmowa, dodałem w teście.
Chris Down,
0

Zauważyłem, że oryginalny post jest dość stary, ale myślę, że te informacje mogą być cenne dla osób szukających rozwiązania, które pozwoli sprawdzić, czy pliki są poprawnie kopiowane. Rsync może być najlepszą metodą kopiowania danych, a odpowiedzi podane w tym wątku są dobre, jednak dla tych, którzy nie mają doświadczenia z Linuksem, postaram się podać bardziej szczegółowe wyjaśnienie.

Scenariusz: Właśnie skopiowałeś dane z dysku na inny, z dużą ilością podkatalogów i plików. Chcesz sprawdzić, czy wszystkie dane są poprawnie skopiowane.

Najpierw sprawdź, czy md5deep jest zainstalowany, wydając polecenie md5deep -v.

Jeśli pojawi się komunikat „Nie znaleziono polecenia”, zainstaluj md5deep przez apt-get install md5deep.

Zakłada się, że chcesz zajmować się tylko zwykłymi plikami. Jeśli chcesz poradzić sobie z innymi typami plików, skorzystaj z opcji -o w instrukcji md5deep. ( man md5deep)

Teraz możesz już iść i zakładamy, że skopiowałeś pliki z /mnt/orginaldo /mnt/backup, zamień je na katalogi, których używasz.

Najpierw przejdź do katalogu źródłowego, jest to oryginalne źródło skopiowanych lub utworzonych kopii plików:

cd /mnt/orginal

Następnie zrób sumę kontrolną dla każdego pliku:

md5deep -rel -o f . >> /tmp/checksums.md5

To polecenie wyjaśniło:

-r włącza tryb rekurencyjny

-e wyświetla wskaźnik postępu

-l włącza względne ścieżki plików.

-o f działa tylko na zwykłych plikach (nie blokuje urządzeń, nazwanych potoków itp.)

. każe md5deep rozpocząć w bieżącym katalogu.

>> /tmp/checksums.md5mówi md5deep, aby przekierował wszystkie dane wyjściowe do /tmp/checksums.md5.

Uwaga: jeśli chcesz zastąpić treść w poprzednich wersjach /tmp/checksums.md5, użyj >i nie>>

Zauważ, że to polecenie może potrwać dość długo, w zależności od prędkości io i rozmiaru danych. Możesz eksperymentować z ładnym i / lub jonice, aby zwiększyć wydajność md5deep, ale to nie wchodzi w zakres tej odpowiedzi.

Po zakończeniu tworzenia sum kontrolnych masz teraz plik zawierający wpisy podobne do:

69c0a826b29c8f40b7ca5e56e53d7f83 ./oldconfig-11-09-2013/etc2/apm/event.d/20hdparm 651f3c7f79a14332f9fa7bb368039210 ./oldconfig-11-09-2013/etc2/apm/event.d7fffb9988788f8898e788f8898e8f9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9b9e8bb9c8b9b9b9bb9cb9f9a /etc2/apm/scripts.d/alsa e9b9131660a8013983bc5e19d7d669eb ./oldconfig-11-09-2013/etc2/ld.so.cache

Pierwsza kolumna to suma kontrolna md5, a druga kolumna to ścieżka względna do pliku, do którego należy suma kontrolna.

Jeśli chcesz zobaczyć, ile plików istnieje w pliku sumy kontrolnej, wydaj polecenie:

wc /tmp/checksums.md5 -l

Teraz chcesz sprawdzić, czy skopiowane dane są poprawne:

cd /mnt/backup

md5deep -o f -reX /tmp/checksums.md5 . >> /tmp/compare.result

Jedyna różnica w porównaniu z momentem utworzenia sum kontrolnych to -X, który wyświetla bieżący skrót pliku, jeśli wpis w pliku checksums.md5 nie jest zgodny. Pod koniec testu, jeśli /tmp/compare.resultjest pusty, możesz ufać, że wszystkie pliki są poprawnie skopiowane, ponieważ sumy kontrolne są zgodne.

Zauważ, że tylko pliki wymienione w /tmp/checksums.md5pliku zostaną sprawdzone pod kątem poprawnej sumy kontrolnej, jeśli w /mnt/backupkatalogu znajdują się dodatkowe pliki , md5deep nie powiadomi Cię o nich.

Uwagi:

  • Nie musisz używać przekierowania do przechowywania plików wyjściowych. Więcej informacji można znaleźć w instrukcji obsługi md5deep.

  • Może być konieczne uruchomienie komend md5deep jako root, w zależności od uprawnień plików, które obsługujesz.

NordicViking
źródło
0

Jeśli chcesz sprawdzić rekurencyjnie różnice między dwoma katalogami /path1i /path2 bez użycia md5deep:

diff <(cd /path1 && find . -type f |xargs md5) <(cd /path2 && find . -type f |xargs md5)

Wyjaśnienie:

  • wszedł path1do, aby wszystkie linie były drukowane przez findbe względem path1( cd /path1)
  • wyświetla listę wszystkich plików rekurencyjnie w bieżącej ścieżce ( && find . -type f)
  • użyj każdego wyjścia linii findjako jako danych wejściowych dla md5( | xargs md5)

Wynik będzie wyglądał tak, jeśli występują jakiekolwiek różnice:

< MD5 (./index.html) = 36b01762f0329b2c12a5186520c7d78a
< MD5 (./inline.js) = ce99823a4b2c24839a727c5781f59a36
< MD5 (./main.js) = 3a597404d3ba7f0a6e3cb093ef57ebb2
---
> MD5 (./index.html) = 3a3d7663a7b2871ff37b9081a53593f9
> MD5 (./inline.js) = 1bbd0ecfc75b578413105c6b9009f9b3
> MD5 (./main.js) = 0f44abe5084add3cabdc39feec0c699878c78
David_p
źródło