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 --delete
yaptığı ş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-owner
bayrağı 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.
find
Onlar 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=C
Sistemleri 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
-print0
bayrakla düzeltir , find
ancak 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, find
desteklemeyen -exec
veya -print0
iş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.