Benim sorunum (ile bir komut dosyasında #!/bin/sh
) aşağıdaki gibidir: Bir dizindeki tüm dosyaları arşivleme amacıyla sağlama toplamı. Tüm dosya adlarına sahip sağlama toplamı (benim durumumda sha1) dosyası aynı dizinde bulunmalıdır. Diyelim ki ~/test
dosya f1
ve f2
: içeren bir dizinimiz var .
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
Şimdi sağlama toplamlarını
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
tam olarak ne istediğimi yapar, sadece geçerli dizinin tüm dosyaları listeler ve sha1 toplamlarını hesaplar (maxdepth daha sonra değiştirilebilir). STDOUT'taki çıktı:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
Ne yazık ki, bunu bir dosyaya kaydetmeye çalışırken
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
sonuçta ortaya çıkan dosya kendisi için sağlama toplamını görüntüler:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
ve bu nedenle shasum --check
, son toplamı kaydederken ek dosya değişikliği sorunu nedeniyle daha sonra başarısız olur .
Etrafa baktım ve -p
bayrağını kullanarak xargs
, bul komutunu çalıştırmadan önce bir şekilde çıktı dosyasını oluşturduğunu öğrendim, bu nedenle ek dosya bulundu ve kontrol edilecek ...
Bir geçici çözüm olarak, sağlama toplamı başka bir konuma (geçici dizin yoluyla mktemp
) kaydedebilir veya özel olarak bulmakta hariç tutabileceğini biliyorum, ama neden böyle davrandığını anlamak istiyorum - ki gözlerimde bu kadar kullanışlı değil, örneğin, ilk komut çıktı dosyasının zaten diskte olup olmadığını kontrol ederse, asla doğru cevabı alamaz ...
sh
çağırma gerektiğinde bunun çalışması garanti edilmez . Daha $0
önce tartışmanız gerektiğini unutmayın {}
.
tee
kayboldu mu? Ben denedim ve iyi çalışıyor, ben de ekleyerek STDOUT bastırdı 1>/dev/null
. Cevabı yanlış olan bir şey mi vardı yoksa bir hata mı?
xargs
çünkü bu dosya oluşturur kabuk kendisidir, daha önce herhangi bir komut öncelikle kabuk yönlendirir tüm giriş, çıkış ve boruları çalıştırıldığında, böylecefind
çıkış dosyasını başlatır zaten var.-exec
Bunun yerine kullanın :find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +