Doğru yol, tam olarak neden sorduğunuza bağlıdır:
Seçenek 1: Yalnızca Verileri Karşılaştırın
Ağacın dosya içeriğinin sadece bir karmaşasına ihtiyacınız varsa, bu işe yarayacaktır:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
Bu, ilk önce tüm dosya içeriğini ayrı ayrı, tahmin edilebilir bir sırayla özetler, ardından dosya adlarından ve MD5 karma listelerinden oluşan bir listeye geçer ve yalnızca ağaçtaki dosyalardan birinin içeriği değiştiğinde değişen tek bir değer verir.
Ne yazık ki, find -s
yalnızca macOS, FreeBSD, NetBSD ve OpenBSD'de kullanılan BSD find (1) ile çalışır. GNU veya SUS bulunan bir sistemde karşılaştırılabilir bir şey bulmak için (1), biraz daha çirkin bir şeye ihtiyacınız vardır:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
Yerine find -s
bir arama yaptık sort
. -k 2
Bit MD5 karma üzerinde atlamak için bunu söyler, bu yüzden sadece tarafından, sonu hat üzerinden alanda 2 içindedir dosya adları, sıralar sort
'ın hesaplaşma.
Komutun bu sürümünde bir zayıflık var, bu durumda eğer içinde yeni satırlar olan herhangi bir dosya adınız varsa, aramaya birden çok satır gibi görüneceğinden kafanız karışabilir sort
. find -s
Ağaç geçişi ve sıralama aynı programı dahilinde gerçekleşmesi nedeniyle varyant, bu sorunu yok find
.
Her iki durumda da, hatalı pozitiflerden kaçınmak için sıralama gereklidir: en yaygın Unix / Linux dosya sistemleri, dizin listelerini kararlı ve öngörülebilir bir düzende tutmaz. Bunu ls
, sizin için dizin içeriğini sessizce sıralayan böyle ve böyle bir işlem yapamazsınız. find
olmadan -s
veya bir sort
çağrı, temel dosya sistemi onları geri döndürdüğü sırada herhangi bir sırayla dosyaları basacaktır; bu, girdi olarak verilen dosyaların sırası değişirse, bu komutun değiştirilmiş bir hash değeri vermesine neden olacaktır.
md5sum
Komutları md5
veya başka bir karma fonksiyonunu değiştirmeniz gerekebilir . Başka bir karma işlevi seçtiyseniz ve sisteminiz için komutun ikinci biçimine ihtiyacınız varsa, sort
komutu uygun şekilde ayarlamanız gerekebilir . Başka bir tuzak, bazı veri toplama programlarının bir dosya adı yazmadığı, eski Unix sum
programının en önemli örneği olduğu .
Bu yöntem bir miktar verimsizdir, md5sum
N + 1 defa çağırılır, burada N ağaçtaki dosya sayısıdır, ancak bu dosya ve dizin meta verilerini toplamak için gerekli bir maliyettir.
Seçenek 2: Verileri ve Meta Verileri Karşılaştırın
Ağaçtaki herhangi bir şeyin değiştiğini algılayabilmeniz gerekiyorsa , yalnızca dosya içeriğini değil tar
, dizin içeriğini sizin için paketlemenizi isteyin ve ardından şunları gönderin md5sum
:
$ tar -cf - somedir | md5sum
Çünkü tar
aynı zamanda vb dosya izinlerini, sahiplik, görür, bu da böyle şeyler değişiklikleri algılar, sadece içeriğini dosyaya değiştirir.
Bu yöntem, ağaçtan sadece bir kez geçmesini sağladığından ve karma programını yalnızca bir kez çalıştırdığından, oldukça hızlıdır.
Yukarıdaki find
temel yöntemde olduğu gibi, tar
temel dosya sisteminin döndürdüğü sırada dosya adlarını işleyecektir. Başvurunuzda bunun olmasına neden olamayacağınızdan emin olabilirsiniz. Durumun muhtemel olduğu en az üç farklı kullanım modelini düşünebilirim. (Bunları listeleyeceğim, çünkü belirtilmemiş davranış bölgelerine giriyoruz. Her dosya sistemi, işletim sisteminin bir sürümünden diğerine bile farklı olabilir.)
Kendinizi yanlış pozitif bulursanız find | cpio
, Gilles'un cevabındaki seçeneğe gitmenizi öneririm .
find .
yerine dizine gitmek en iyisidirfind somedir
. Bu yolla, dosya adları farklı yol özellikleri bulmak için kullanılırken aynıdır; Bu zor olabilir :-)