Dizinler dizini için sha1sum


33
sha1sum ./path/to/directory/* | sha1sum 

Yukarıdakiler, dosyaları içeren bir dizinin sha1sum'unu hesaplamanın bir yolu olarak gönderildi . Dizin daha fazla dizin içeriyorsa bu komut başarısız olur. Genelde bir dizin dizininin sha1sum'unu evrensel olarak (söz konusu dizine özel bir algoritma uyarlamadan) tekrarlayarak hesaplamanın bir yolu var mı?

Yanıtlar:


14

Bu SO yazısı için teşekkürler -

find . -type f \( -exec sha1sum "$PWD"/{} \; \) | sha1sum

Uyarı: Bu kod test edilmedi ! Yanlış ise ve bu sorunu çözebilirseniz bu soruyu düzenleyin; Düzenlemenizi onaylayacağım.


Üzgünüm; Karşı koyamadım! ;-) Özyineleme eğlencelidir. Tabii ki bir yolu var. Şimdi uygun bir cevap yazacağım.
allquixotic

3
Bu, farklı makinelerdeki aynı klasörler için aynı karmaşayı oluşturmaz çünkü çıktı, farklı makinelerde farklı olan ve farklı makinelerde farklı karma yollara neden olan <hash> ve <dosya yolu> da içerir. Doğru çizgi find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum@ allquixotic
alper

1
Buna ek olarak, sıralama düzeninin farklı makinelerde farklı olması durumunda farklı karmaşa da yol açacak dosya sıraları sıralanmalıdır.
alper

40

Genelde "find | xargs" modelini seviyorum, şöyle:

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

Dosya adlarında boşluk olması durumunda "-print0" ve "-0" kullanmanız gerekir.

Ancak, bu "find -exec cmd {}" şablonuna çok benzer.

Buradaki iki modeli karşılaştıran bir tartışmaya bakın: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs


Cevabınız sadece dosyaların karma değerini döndürür. Klasörün karma kullanımı kullanılarak elde edilmelidir find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum.
alper

5

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.


Tüm dosya adlarının toplam uzunluğu komut satırına uyduğunda, sort -z( --zero-terminated) aracılığıyla borulamak bir grup dosyayı karıştırmaktan daha kolaydır.
Anton Samsonov

@AntonSamsonov Bu gerçekten eski bir komut dosyası, ben sadece o zaman komut dosyası öğreniyordum. O zamandan beri birçok kez yeniden yazdım. Yorumunuzla ilgili olarak, sıralama sırasında sıfıra son verme işlemi ne yapar: Sıralamadaki man sayfasını okurum. Sıfır sonlandırmanın yeni satır yerine satırın sonunda sıfır baytlık çubuk olduğunu söyler. Bu ne başarır?
thebunnyrules

Bu komut için burada ayrı bir yanıt olarak bir güncelleme yayınladım: superuser.com/questions/458326/…
thebunnyrules

4

GİRİŞ

Birkaç yıl önce, geçerli dizin yapısındaki tüm dosyaların hash imzalarını kontrol edip bir metin dosyasında liste halinde çıktısını alabilen bir komut dosyası yazdım ve sundum (bu konu başlığında).

O zamandan beri, bu formülü birkaç kez geliştirdim. Buraya yeni ve geliştirilmiş betiğimi ayrı bir cevap olarak tekrar göndermeye karar verdim. Sha256 için yazılmıştır, ancak sha1 kullanmak isteyen herkes, sha256'yı sha1 ile değiştirmek için basit bir arama yapabilir ve gedit ile değiştirebilir. Şahsen, sha1'i birkaç yıldır kullanmadım ve eski haline geldiğinden ve Google'ın nasıl tehlikeye girebileceğini gösterdiğinden tavsiye etmem .

İşte yeni komut dosyamın yaptığı şey:

  1. Komut dosyasını kullanmak istediğiniz dizine gidip girerek kullanabilirsiniz:

    sha256rec

    Alternatif olarak, aşağıdakileri yaparak bu betiği başka bir dizinden çağırabilirsiniz:

    sha256rec "/path/to/target/directory/you/want/hash"
  2. Script, geçerli dizinde yazma hakkınız olup olmadığını tespit eder. Bunu yaparsanız, sonuçlar geçerli dizine kaydedilir. Yazma ayrıcalıklarına sahip değilseniz veya geçerli dizininiz salt okunur bir sistemdeyse (cdrom gibi), sonuçlar geçerli kullanıcının giriş dizinine kaydedilir.

  3. Komut dosyası, alt dizinlerden bazılarının geçerli kullanıcı ayrıcalıklarında erişilebilir olup olmadığını algılar. Eğer herkes okunabiliyorsa, bir ayrıcalık yükselmesi gerçekleşmez, eğer değilse, kullanıcının ayrıcalıkları kökten artar.

  4. Bul, geçerli dir yapısındaki tüm dosyaları bulmak için kullanılır (tüm alt dizinler dahil). Sıralama, sonuçların alfabetik olarak alındığından emin olmak için kullanılır. Sonuçta ortaya çıkan liste sha256sum'dan geçer ve bir metin dosyasına verilir.

  5. Eski senaryoyu yazdığımdan beri, geçici dosyaların kötü olduğu ve kullanıcıları kötü niyetli üçüncü şahıslar tarafından gözetlenmeye ve kurcalamaya açık bıraktıkları için mümkün olduğunda kaçınılması gereken bir tasarım felsefesi benimsedim. Dolayısıyla bu yeni betiğin içindeki tüm veriler, sonuçların bir metin dosyası olarak çıktığı son dakikaya kadar değişkenler olarak manipüle edilir.

  6. Sonuçta ortaya çıkan dosyanın kendisi özetlenir ve yol / özet terminalde çıkar. Sonuçların daha sonraki bir tarihte başvurduğumda değiştirilmediğinden emin olmak için eski bir çevrimdışı kamerayla bu karma fotoğrafların fotoğraflarını çekmeyi seviyorum.

  7. Eski sonuç dosyaları taksitte yoksayılır. Sonuçların karşılaştırılmasını kolaylaştırır.

Scriptimi çalıştırırken terminal çıktısının bir örneği:

kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ sha256rec
======================================================================= 
sha256rec:         
=======================================================================        
Current Folder : /usr/src/linux-headers-4.13.0-16-generic   
Target Folder  : /usr/src/linux-headers-4.13.0-16-generic
Output File    : /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt


Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder.
f3ddb06212622c375c6bcc11bd629ce38f6c48b7474054ca6f569ded4b4af9d8  /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt
Operation Length: 10 Seconds.
=======================================================================
kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ 

İşte 000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt dosyasında bulunabilecek çıktının bir parçası:

79c3f378a42bd225642220cc1e4801deb35c046475bb069a96870ad773082805  ./.9491.d
2e336c69cde866c6f01a3495048d0ebc2871dd9c4cb5d647be029e0205d15ce6  ./.config
174f23ff7a7fba897bfb7cf17e9a501bcecacf7ef0c0d5cf030414c1e257d4e3  ./.config.old
389d83f546b250304a9a01bb3072ff79f9d9e380c8a2106cadbf714a872afe33  ./.missing-syscalls.d
035dc77da819101cb9889b4e515023dddd2c953f00d2653b87c6196a6560903e  ./Module.symvers
b28054d7995233e6d003ceb9ed119a0b3354f5ccf77b8d687fc0353ae3c5bfb8  ./arch/x86/include/generated/asm/.syscalls_32.h.cmd
01cf821170e3e6e592e36a96e8628377151c762ac2ee3210c96004bfaef22f5f  ./arch/x86/include/generated/asm/.syscalls_64.h.cmd
111efa83187c58a74a9b0170fd496b497b0682d109a7c240c17e2ffcc734f4f4  ./arch/x86/include/generated/asm/.unistd_32_ia32.h.cmd
fcba4e8abf9e95472c31708555db844ac43c87260fb0ba706b6f519404bf9aba  ./arch/x86/include/generated/asm/.unistd_64_x32.h.cmd
3264438a54cbf7e62b05d38a93c5df8fe4202ac782a5d83ed202cba9eee71139  ./arch/x86/include/generated/asm/.xen-hypercalls.h.cmd
4bd7a45837da7de379b87242efe562ce06bf9d8ab8f636c205bb5ef384c8f759  ./arch/x86/include/generated/asm/clkdev.h
0d96461abd23bbf2da522822948455413a345f9ef8ac7a7f81c6126584b3c964  ./arch/x86/include/generated/asm/dma-contiguous.h
b1a54c24a12ce2c0f283661121974436cdb09ae91822497458072f5f97447c5d  ./arch/x86/include/generated/asm/early_ioremap.h
dd864107295503e102ea339e0fd4496204c697bdd5c1b1a35864dfefe504a990  ./arch/x86/include/generated/asm/mcs_spinlock.h
782ce66804d000472b3c601978fa9bd98dcf3b2750d608c684dc52dd1aa0eb7e  ./arch/x86/include/generated/asm/mm-arch-hooks.h
cd9913197f90cd06e55b19be1e02746655b5e52e388f13ec29032294c2f75897  ./arch/x86/include/generated/asm/syscalls_32.h
758ce35908e8cfeec956f57a206d8064a83a49298e47d47b7e9a7d37b5d96d59  ./arch/x86/include/generated/asm/syscalls_64.h
1147ca3a8443d9ccbdf9cd1f4b9b633f0b77f0559b83ec5e4fa594eadb2548be  ./arch/x86/include/generated/asm/unistd_32_ia32.h
ca5223fbf8f03613a6b000e20eb275d9b8081c8059bc540481a303ce722d42f3  ./arch/x86/include/generated/asm/unistd_64_x32.h
31703052c0d2ab8fe14b4e5dfcc45fcbd5feb5016b0a729b6ba92caa52b069e2  ./arch/x86/include/generated/asm/xen-hypercalls.h
c085ff1b6e9d06faa3fc6a55f69f9065c54098d206827deec7fe0a59d316fc99  ./arch/x86/include/generated/uapi/asm/.unistd_32.h.cmd
7929c16d349845cebb9e303e0ff15f67d924cac42940d0f7271584f1346635fc  ./arch/x86/include/generated/uapi/asm/.unistd_64.h.cmd
9aa492c5a75f5547f8d1dc454bef78189b8f262d1c4b00323a577907f138a63e  ./arch/x86/include/generated/uapi/asm/.unistd_x32.h.cmd
f568e151bbbb5d51fd531604a4a5ca9f17004142cd38ce019f0d5c661d32e36b  ./arch/x86/include/generated/uapi/asm/unistd_32.h
c45cf378498aa06b808bb9ccf5c3c4518e26501667f06c907a385671c60f14ae  ./arch/x86/include/generated/uapi/asm/unistd_64.h
a0088d8d86d7fd96798faa32aa427ed87743d3a0db76605b153d5124845161e2  ./arch/x86/include/generated/uapi/asm/unistd_x32.h
e757eb6420dffa6b24b7aa38ca57e6d6f0bfa7d6f3ea23bbc08789c7e31d15fa  ./arch/x86/kernel/.asm-offsets.s.cmd
f9e703e4f148d370d445c2f8c95f4a1b1ccde28c149cff2db5067c949a63d542  ./arch/x86/kernel/asm-offsets.s
7971fb3e0cc3a3564302b9a3e1ad188d2a00b653189968bbc155d42c70ce6fbf  ./arch/x86/purgatory/.entry64.o.cmd
8352d79fe81d2cf694880f428e283d79fd4b498cea5a425644da25a9641be26b  ./arch/x86/purgatory/.kexec-purgatory.c.cmd
37f3edbee777e955ba3b402098cb6c07500cf9dc7e1d44737f772ac222e6eb3e  ./arch/x86/purgatory/.purgatory.o.cmd
bb8b895cbd2611b69e2f46c2565b4c2e63a85afb56cff946a555f2d277ee99b2  ./arch/x86/purgatory/.purgatory.ro.cmd
bcc2365c9d3d027f1469806eb4f77b0f3ede6eb0855ea0fcd28aa65884046a54  ./arch/x86/purgatory/.setup-x86_64.o.cmd
872229f334fdcc8562e31b9f6581008c1571ac91f12889cd0ff413590585155a  ./arch/x86/purgatory/.sha256.o.cmd
6fb0cbef120aadee282f7bc3b5ea2f912980f16712281f8f7b65901005194422  ./arch/x86/purgatory/.stack.o.cmd
cd1b61063ae3cf45ee0c58b2c55039f3eac5f67a5154726d288b4708c4d43deb  ./arch/x86/purgatory/.string.o.cmd
e5826f0216fd590972bbc8162dd175f87f9f7140c8101505d8ca5849c850ec91  ./arch/x86/purgatory/entry64.o

(bunun gibi başka bir 7000+ hat için devam eder ama siz anlarsınız)

KURULUM

  1. Bir terminal açın ve aşağıdaki komutları girin:

    cd /usr/bin
    sudo su
    echo '#!/bin/bash'> /usr/bin/sha256rec
    chmod +x /usr/bin/sha256rec
    touch /usr/bin/sha256rec
    nano /usr/bin/sha256rec
  2. Nano'da yapıştırmak için Shif + Ctrl + v tuşlarını kullanın. Ctrl-O ve kaydetmek için Enter. Ctr-X çıkar. Komut dosyasını buraya yapıştırın:

(#! / bin / bash öğesinden sonra yapıştırın)

  #FUNCTIONS OR FUNCTYOU?
  function s_readonly { err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; echo $(cat /tmp/$err|grep -i "Read-only file system"|wc -l);shred -n 0 -uz /tmp/$err; }
  function w_denied { echo $(err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function r_denied { echo $(err=$(date +%s%N); cd "$1" >/dev/null 2> /tmp/$err; find . >/dev/null 2>> /tmp/$err; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function rando_name { rando=$(echo $(date +%s%N)|sha256sum|awk '{print $1}'); rando=${rando::$(shuf -i 30-77 -n 1)}; echo $rando;}
  function ms0 { ms0=$(($(date +%s%N)/1000000)); }; function mstot { echo $(($(($(date +%s%N)/1000000))-$ms0));}
  function s0 { s0=$(date +%s); }; function stot { echo $(($(date +%s)-$s0));}
  s0

  #CHECK IF A TARGET DIR WAS SPECIFIED (-t= or --target= switch)
  if [ ! -z "$1" ]; then arg1="$1"; arg1_3=${arg1::3}; arg1_9=${arg1::9};fi
  if [ "$arg1_3" = "-t=" -o "$arg1_9" = "--target=" ]; then 
    switch=$(echo $arg1|awk -F '=' '{print $1}')
    switch_chr=$((${#switch}+1))
    target=${arg1:$switch_chr}
    current=$(pwd)
    cd "$target"
    arg1="" #<- cancels the not path in the find line
  else
    current=$(pwd)
    target=$(pwd) 
  fi

  echo -e  "=======================================================================\
    \nsha256rec: \
          \n=======================================================================\
          \nCurrent Folder : $current \
    \nTarget Folder  : $target"

  #GETS DEFAULT_USER, ASSUME'S YOU'RE USER 1000, IF 1000 DOESN'T EXIST SEARCHES 999, THEN 1001, 1002
  default_user=$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)
  if [ -z "$default_user" ]; then default_user=$(awk -v val=999 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1001 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1002 -F ":" '$3==val{print $1}' /etc/passwd); fi

  if [ "$(users | wc -l)" = "1" ]; then USER=$(users|awk '{print $1}'); else USER=$default_user;fi #not perfect but meh...

  #running rando_name in this very specific spot between USER detection and Permission detection, some interfers somehow with detection functions... 
  #the rando function placed underneath the user detection is somehow turning c=$current from the dir path to whatever rando_name puts out.

  #FIGURE OUT WHERE TO PUT HASH LIST
  hash_file="000_sha256sum_recurs_${target##*/}_d_$(date +%d-%m-20%y)_t_$(date +%H.%M).txt"
  if [ $(s_readonly "$current") -gt 0 -o $(w_denied "$current") -gt 0 ]; then if [ "$(whoami)" != root ]; then dest="/home/$(whoami)";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder."; else dest="/home/$USER";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently a Read-Only system. You can find the hash results in $USER's home folder.";fi; else dest="$current";echo -e "Output File    : $dest/$hash_file\n\n";echo "Results will be saved here.";fi



  #CAN REGULAR USER ACCESS TARGET DIR? ARE ALL IT'S SUBDIRS READABLE?
  if [ $(r_denied "$target") -gt 0 ]; then sudo=sudo; echo "Some folder were not read-able as a regular user. User elevation will be required.";fi

  #PERFORM RECURSIVE HASHING
  command=$($sudo find . -type f -not -type l -not -path "$arg1"  -not -path "$2"  -not -path "$3" -not -path "$4"  -not -path "$5"  -not -path "$6" -not -path "$7"  -not -path "$8"  -not -path "$9" |grep -v "\./000_sha"|sort|awk "{print \"$sudo sha256sum \\\"\"\$0}"|awk '{print $0"\""}'|tr '\n' ';')
  eval $command > "$dest/$hash_file"

  sha256sum "$dest/$hash_file"
  echo "Operation Length: $(stot) Seconds."
  echo -e  "======================================================================="



  if [ "$target" != "$current" ]; then cd "$current";fi


  exit
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  1. Nano'dan çıkarken, girerek durumdan çıkmayı unutmayın:

    exit

SON DÜŞÜNCELER

  1. Bu, yalnızca bash kurulu olduğunda çalışır. Sh, dash, ksh veya zsh ile çalışmayan substring manipülasyonu için bazı synthax kullandım. Diğer mermilerden herhangi birini günlük sürücüleriniz olarak da kullanabilirsiniz, ancak bash kurulu olmalıdır.

  2. Çıktı alınan listeler aşağıdakiler gibi çeşitli araçlarla karşılaştırılabilir: (terminalde) diff, sdiff (ve grafiksel) diffuse, kdiff, winmerge.

  3. Dosyam, çıktıyı insanlar tarafından okunmasını kolaylaştırmak için yola göre sıralar. Sort komutunun farklı dağıtımlarda farklı çalıştığını fark ettim. Örneğin, bir dağıtımda CAPITAL harfleri büyük harflere göre değil, diğerlerinde ise öncelikli olmuştur. Bu, çıktı dosyalarının satır sırasını etkiler ve dosyaların karşılaştırılmasını zorlaştırabilir. Komut dosyasını her zaman aynı dağıtımda kullanıyorsanız, karma listeler iki farklı ortamda oluşturulmuşsa bu herhangi bir sorun sunmamalıdır. Bu, karma dosyalarının ek bir zaman olarak sıralanmasıyla kolayca giderilir, böylece satırlar yol yerine karma tarafından sıralanır:

     cat 000_sha256sum_oldhashlist|sort> ./old
     cat 000_sha256sum_newhashlist|sort> ./new
     sha256sum ./old ./new; diff ./old ./new

Bir daha sağlam shebang hattı olacaktı #!/usr/bin/env bash- ikincisi takılabilir çünkü, hem de diğer dizinlerde Bash bulacaksınız / usr / bin yerine / bin , örneğin, bu arada env içinde olma eğilimindedir / usr / bin her zaman farkettiğim kadarıyla. Ayrıca, Bash'e ihtiyaç duyduğunuzdan [[ blah-blah ]], daha genel [ blah-blah ]tek-dirsek varyantı yerine çift direkli koşullu ifade kullanabileceğinizi de unutmayın .
Anton Samsonov

İşaretçiler için teşekkürler. Sadece [[şartlılar] 'ı aramayı bitirdim. Gerçekten işe yarar görünüyorlar.
thebunnyrules

SHA1'in ödün verilmesine ilişkin kaygı, bütünlüğün doğrulanması için kopyalandıktan sonra dosyaların karşılaştırılması durumunda geçerli değildir. Bir dosyanın taşıma sırasında bozulmuş ancak aynı SHA1'e sahip olma olasılığı neredeyse sıfırdır. Bir saldırganın, çarpışan bir SHA1 ile farklı bir dosya oluşturmak için yeterli zamanı olabileceğinden şüpheleniyorsanız, SHA256'yı kullanın, ancak tipik dosya kopyalama için bu, SHA1 veya MD5'ten daha yavaş ve daha yavaş .
Dan Dascalescu

Siz kendi argümanlarınız kendinize karşı kullanılabilir. Normal (saldırıyla ilgili olmayan) yolsuzluklarla ilgili endişeleriniz varsa, sha1'in kendisi fazladır. Md5 / crc32 kullanarak daha hızlı sonuç alabilirsiniz. Her iki durumda da (kurcalama tespiti veya bozulma) sha1 iyi bir uyum değildir. Şahsen, bu karma listeleri her iki senaryo için de kullanıyorum ve sha256'ya yükselttiğimden beri algılanabilir hiçbir performans farkına varamadım ancak mega sunucu da kullanmıyorum. Cevapta söylediğim gibi, sha256sum komutumu istediğiniz komutla değiştirerek istediğiniz herhangi bir hasarı kullanmakta özgürsünüz: sha1sum, md5sum, b2sum, crc32 ...
thebunnyrules

1

Bu benim için çalışıyor gibi görünüyor:

find . \( -not -name . \) -type f -exec cat {} + | sha1sum

EDIT: Bu sadece dizin ağacında bulunan tüm dosyaları sha1sum olacaktır. Eğer bir yönetmenin adı değişmiş olsaydı, bu onu yakalamazdı. Belki bir şey gibi:

find . -exec sha1sum {} + 2>&1 | sha1sum

Yapardı. Diğer cevapla aynı cevap hakkında


1

Başka bir püf noktası dosya içeriğini ve meta verilerini toplamak için tar kullanmak olabilir:

tar -cf - ./path/to/directory | sha1sum

Sadece bir oy hakkına sahip olduğunu çok kötü
166_MMX

1
Bu çalışmıyor. tar, bazı işletim sistemleri (OSX gibi) için bir zaman damgası içerir ve sha1sum her çalıştırmada farklı olacaktır.
brüt

Ne roross dedi. Ayrıca, iki ana bilgisayarda farklı tar sürümleri varsa, çıktılar farklı olacaktır.
Dan Dascalescu

1

Hızlı, sağlam ve taşınabilir çözüm

İlgili diğer çözümlerden farklı olarak, taraşağıdaki çözüm standart Unix yardımcı programlarına sahip herhangi bir makinede çalışır ve sağlama toplamı paralelleştirilerek diğer tüm çözümlerden daha hızlıdır:

find . -type f | xargs -d'\n' -P0 -n1 md5sum | sort -k 2 | md5sum

Sonunda bir sıralama kullandığından, gerçek zamanlı bir ilerleme yoktur, bu nedenle sadece komutu çalıştırın.

İşte argümanlar ne yapar:

  • find . -type f Geçerli dizindeki ve alt dizinlerindeki tüm dosyaları bulur.
  • xargs -d'\n'find çıktısını satırlara böler (içinde yeni satırlı dosyalar olmasını beklerseniz normal olanı yapın find -print0 | xargs -0)
  • -P0 n1md5sumMakine tarafından desteklenen maksimum işlem sayısını kullanarak paralel işlemlerde çalışır (çok çekirdekli!)
  • sort -k 2md5sumHer dosyanın tam yolu olan çıktının ikinci alanına göre sıralar (ilk MD5)
  • Nihai md5sumhesaplar kolayca terminali pencereler arasında görsel olarak karşılaştırabilirsiniz tek satırda tamamı dizinin bir sağlama almak size böylece dosya sağlama listesinin bir sağlama toplamı,

"MD5'in tehlikeye atıldığını" söylemeden önce, tehdit modelinizin ne olduğunu unutmayın. Başka bir ana bilgisayardan veya diskten kopyaladığınız dosyaların bozulmamış olduğundan emin olmaya çalışıyor musunuz? O zaman MD5 fazlasıyla yeterlidir, çünkü bir dosyanın transit olarak bozulması ancak aynı MD5'e sahip olma olasılığı sıfırdır. Ancak, bir dosyayı çarpışan bir sağlama toplamıyla farklı bir dosyayla değiştirme zamanı olan bir saldırgandan korkuyorsanız, kullanın sha256sum. Olumsuz tarafı, SHA işlevlerinin MD5'ten daha yavaş olmasıdır .

Gerçek zamanlı ayrıntılı ilerleme

Son olarak, gerçek zamanlı ilerleme görmek istiyorsanız, sağlama toplamı için geçici bir dosya kullanmak üzere boru hattını değiştirin:

find . -type f | xargs -d\\n -P0 -n1 md5sum | tee /tmp/sums && sort -k 2 /tmp/sums | md5sum

( Paralel olarak sortsağa ilerlemenin findişe yaramayacağına dikkat edin, çünkü xargs -P0paralellikler md5sumve sonuçlar sıra dışı olabilir.)

Komutun bu sürümü ayrıca iki dosyayı dağıtabilmenizi sağlar /tmp/sums(aynı makinedeyse ikincisini yeniden adlandırdığınızdan emin olun) ve hangi dosyaların farklı olduğunu görün.


0

Tüm karma bilgileri içeren ONE muazzam bir dosyaya sahip olmaktansa, bir ağacın her klasöründe bir dosya yapmanın bir yolunu arıyordum. Buradaki yorumlardan ilham aldım. Benimki burada yayınlananlardan biraz daha karmaşık. Dosya döndürmeyi kullanıyorum, ancak bu yeni oyuncular için en az karmaşık olanı. Bu sürüm eski çeklerin üzerine yenileriyle yazacak. Ne sıklıkta çalıştırdığınıza ve 'derinlik' gereksiniminize bağlı olarak 2-3 sürümü saklamak iyi olabilir.

[user @ host bin] $ cat mkshaindir 
#! / Bin / tire
1 $ cd
sha512sum *> .sha512sum

[user @ host bin] $ find / var / tmp -tipi d -print0 | xargs -0 -i mkshaindir {}

Amaçlarım için mkshaindir'in ayrı bir bileşen olduğuna dikkat edin, çünkü yeni bir klasörde veya yakın zamanda değiştirilmiş bir dosyada bir hash yapmam gerekebilir. Gerekirse bunların hepsi bir komut dosyasında birleştirilebilir.

Gerisi okuyucu için bir egzersiz olarak bırakılmıştır.


0

önceki cevaba göre :

find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum

  • istikrarlı sıralama
  • sayısal sahip ve grup kimliği
  • ayrıntılı ilerleme
  • dosya adı güvenli

Bu sadece bir dosya içeren kopyalanmış bir dizinde işe yaramadı ve sanırım uzak ana bilgisayardaki tar (1.28) 'in biraz daha eski bir sürümünü, yerel ana bilgisayarda 1.29 çalıştığımı sanıyorum. Ne yazık ki, katran 1.29 edilmemiştir backported Xenial üzerinde.
Dan Dascalescu

0

@allquixotic'ın cevabı, doğrulamamıza ve tutarlı hassata sahip olmamıza yardımcı olmayacak farklı makinelerde aynı hasarı üretmiyor.

Aşağıdaki satır find . -type f \( -exec md5sum "$PWD"/{} \; \)çıktıyı döndürür:

d41d8cd98f00b204e9800998ecf8427e  /home/helloWorld.c
24811012be8faa36c8f487bbaaadeb71  /home/helloMars.c

Dolayısıyla yol farklı makinelerde farklı olacaktır. awk '{print $1}'Sadece dosyaların karma olan ilk sütunu elde etmemize yardımcı olacaktır. Daha sonra, siparişin farklı makinelerde farklı olabileceği bu hastayı sıralamamız gerekiyor, bu da ikiden fazla dosya varsa farklı hash'lere sahip olmamıza neden olabilir.


Çözüm:

Mac için:

find ./path/to/directory/ -type f \( -exec md5 -q  "$PWD"/{} \; \) | awk '{print $1}' | sort | md5

Linux için:

find ./path/to/directory/ -type f \( -exec md5sum "$PWD"/{} \; \) | awk '{print $1}' | sort | md5sum | awk '{print $1}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.