GÜNCELLEME: Bu cevabı gönderdiğimden bu yana birkaç yıl geçti ve bu arada birkaç kez sunduğum betiği tekrar yazdım ve geliştirdim. Yeni senaryoyu yepyeni bir cevap olarak tekrarlamaya karar verdim. Bunun üzerine çok tavsiye ederim.
GİRİŞ
Find komutunun bir dizinde bulunan öğeleri çıkardığı sıranın farklı bölümlerdeki aynı dizinlerde değiştiğini gözlemledim. Aynı dizinin karma değerlerini karşılaştırıyorsanız, bu konuda endişelenmenize gerek yoktur ancak kopya sırasında hiçbir dosyanın kaçırılmadığından veya bozulmadığından emin olmak için sağlama alıyorsanız, ek bir satır eklemeniz gerekir. dizinin içeriğini ve elemanlarını sıralama. Örneğin, Matthew Bohnsack'in cevabı oldukça zarif:
find ./path/to/directory/ -type f -print0 | xargs -0 sha1sum
Ancak, kopyalanan bir dizini orijinaliyle karşılaştırmak için kullanıyorsanız, çıktıyı Kompare veya WinMerge kullanarak veya sadece her lisenin hashlerini alarak diğer dizinden çıkarılan listeyle karşılaştıracağınız bir txt dosyasına gönderirsiniz. . Mesele şu ki, bulma aracının içeriğin çıktısını alma sırası bir dizinden diğerine değişebildiğinden, Kompare birçok farklılığa işaret edecektir çünkü karma aynı sırada hesaplanmamıştır. Küçük dizinler için büyük bir sorun değil, ancak 30000 dosyayla ilgileniyorsanız oldukça sinir bozucu. Bu nedenle, karma listeleri iki dizin arasında karşılaştırmayı kolaylaştırmak için çıktıyı sıralamada ek adımlar atmış olursunuz.
find ./path/to/directory/ -type f -print0 | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt
Bu, çıktıyı, farklı karma programı çalıştırırken (yeni dizinde eksik dosya olmaması şartıyla) aynı satırda olacak şekilde aynı kareye sahip olacak şekilde sıralar.
VE YAZIYLA ...
İşte yazdığım bir senaryo. Find / xarg'ın cevapladığı şeyin aynısını yapar, ancak sha1sum'u almadan önce dosyaları sıralar (aynı dizinde tutar). Komut dizisinin ilk satırı, dizindeki tüm dosyaları tekrar tekrar bulur. Bir sonraki sonuç sonuçları alfabetik olarak sıralar. Aşağıdaki iki, sıralanan içeriği alır ve sıralanan listedeki dosyalara bir sha1sum ve tırnak işareti ekler; bu, her bir dosya karmasını hesaplayan ve bunu content_sha1sum.txt dosyasına veren büyük bir kabuk betiği yapar.
#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt
Bu yardımcı olur umarım.