ire_and_curses'in kullanma önerisinde tar c <dir>bazı sorunlar var:
- tar, dizin girdilerini dosya sisteminde saklandıkları sırayla işler ve bu sırayı değiştirmenin bir yolu yoktur. Farklı yerlerde "aynı" dizine sahipseniz ve bunu düzeltmenin bir yolunu bilmiyorum (tar, girdi dosyalarını belirli bir sırayla "sıralayamaz").
- Genelde groupid ve ownerid numaralarının aynı olup olmadığı ile ilgilenirim, grup / sahibin dize gösteriminin aynı olup olmadığı gerekmez. Bu, örneğin
rsync -a --deleteyaptığı şeyle aynı doğrultudadır : hemen hemen her şeyi (eksi xattrs ve acls) senkronize eder, ancak sahibi ve grubu dizgi temsiline göre değil, kimliklerine göre senkronize eder. Dolayısıyla, aynı kullanıcılara / gruplara sahip olması gerekmeyen farklı bir sistemle senkronize ettiyseniz, --numeric-ownerbayrağı tar'a eklemelisiniz.
- tar, kendisini kontrol ettiğiniz dizinin dosya adını içerecektir, sadece dikkat edilmesi gereken bir şey.
İlk sorun için herhangi bir çözüm bulunmadığı sürece (veya bunun sizi etkilemeyeceğinden emin olmadığınız sürece), bu yaklaşımı kullanmam.
findOnlar sadece checksumming zihni boş dizinleri tutmalı eğer bir sorun haline gelir dosyaları değil dizinleri içerir çünkü yukarıda önerilen tabanlı çözümler de hiç iyi.
Son olarak, önerilen çözümlerin çoğu tutarlı bir şekilde sıralanmaz, çünkü harmanlama sistemler arasında farklı olabilir.
Bulduğum çözüm bu:
dir=<mydir>; (find "$dir" -type f -exec md5sum {} +; find "$dir" -type d) | LC_ALL=C sort | md5sum
Bu çözümle ilgili notlar:
-
LC_ALL=CSistemleri arasında güvenilir bir sıralama düzeni sağlamaktır
- Bu, "satırla \ nadlı" bir dizin ile "adı" ve "satırla" olan iki dizin arasında ayrım yapmaz, ancak bunun gerçekleşme olasılığı çok düşük görünüyor. Biri bunu genellikle bir
-print0bayrakla düzeltir , findancak burada başka şeyler olduğu için, yalnızca komutu daha karmaşık hale getirecek çözümleri görebiliyorum, buna değer.
Not: Sistemlerimden biri, finddesteklemeyen -execveya -print0işaretlemeyen sınırlı bir meşgul kutusu kullanıyor ve ayrıca dizinleri belirtmek için "/" ekliyor, ancak findutils bulamıyor gibi görünüyor, bu nedenle bu makine için çalıştırmam gerekiyor:
dir=<mydir>; (find "$dir" -type f | while read f; do md5sum "$f"; done; find "$dir" -type d | sed 's#/$##') | LC_ALL=C sort | md5sum
Şans eseri, adlarında satırsonu olan dosya / dizin yok, bu yüzden bu sistemde bir sorun değil.