Sugestia ire_and_curses dotycząca używania tar c <dir>
ma pewne problemy:
- tar przetwarza pozycje katalogu w kolejności, w jakiej są one przechowywane w systemie plików i nie ma możliwości zmiany tej kolejności. Skutecznie może to dać zupełnie inne wyniki, jeśli masz „ten sam” katalog w różnych miejscach, a ja nie wiem jak to naprawić (tar nie może „sortować” swoich plików wejściowych w określonej kolejności).
- Zwykle interesuje mnie, czy numery groupid i ownerid są takie same, niekoniecznie czy ciąg reprezentujący grupę / właściciela jest taki sam. Jest to zgodne z tym, co na przykład
rsync -a --delete
robi: synchronizuje praktycznie wszystko (bez xattrs i acls), ale synchronizuje właściciela i grupę na podstawie ich identyfikatora, a nie reprezentacji ciągu. Więc jeśli zsynchronizowałeś się z innym systemem, który niekoniecznie ma tych samych użytkowników / grupy, powinieneś dodać --numeric-owner
flagę do tar
- tar będzie zawierał nazwę pliku katalogu, który sam sprawdzasz, tylko coś, o czym należy pamiętać.
Dopóki nie ma rozwiązania dla pierwszego problemu (lub jeśli nie masz pewności, że nie dotyczy on Ciebie), nie zastosowałbym tego podejścia.
W find
oparciu rozwiązania zaproponowane powyżej to również nie jest dobre, ponieważ obejmują one tylko te pliki, nie katalogów, która staje się problemem, jeśli was sum kontrolnych należy pamiętać pustych katalogów.
Wreszcie, większość sugerowanych rozwiązań nie sortuje się konsekwentnie, ponieważ sortowanie może być różne w różnych systemach.
Oto rozwiązanie, które wymyśliłem:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
Uwagi dotyczące tego rozwiązania:
- Ma
LC_ALL=C
to na celu zapewnienie niezawodnej kolejności sortowania w różnych systemach
- Nie powoduje to rozróżnienia między katalogiem „o nazwie \ nzawiniętej linii” a dwoma katalogami o nazwie „o nazwie” i „z nową linią”, ale prawdopodobieństwo wystąpienia tego jest bardzo mało prawdopodobne. Zwykle naprawia się to za pomocą
-print0
flagi dla, find
ale ponieważ są tu inne rzeczy, widzę tylko rozwiązania, które uczyniłyby polecenie bardziej skomplikowanym, niż jest warte.
PS: jeden z moich systemów używa ograniczonego busyboxa, find
który nie obsługuje -exec
ani -print0
flag, a także dodaje „/” w celu oznaczenia katalogów, podczas gdy findutils find nie wydaje się, więc dla tego komputera muszę uruchomić:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
Na szczęście nie mam plików / katalogów z nowymi wierszami w nazwach, więc nie jest to problem w tym systemie.