Masalah saya (dalam skrip dengan #!/bin/sh
) adalah sebagai berikut: Saya mencoba untuk checksum semua file dalam direktori untuk keperluan arsip. File checksum (dalam kasus saya sh1) dengan semua nama file harus berada di direktori yang sama. Katakanlah kita memiliki direktori ~/test
dengan file f1
dan f2
:.
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
Sekarang menghitung checksum dengan
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
tidak persis apa yang saya inginkan, itu daftar semua file dari direktori saat ini saja dan menghitung jumlah sha1 (maxdepth dapat diubah kemudian). Output pada STDOUT adalah:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
Sayangnya, ketika mencoba menyimpan ini ke file dengan
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
file yang dihasilkan menampilkan checksum untuk dirinya sendiri:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
dan karena itu gagal di kemudian hari shasum --check
, karena masalah nyata modifikasi file tambahan saat menyimpan jumlah terakhir.
Saya melihat sekeliling dan dengan menggunakan -p
flag untuk xargs
, saya menemukan bahwa entah bagaimana ia membuat file output bahkan sebelum mengeksekusi perintah find, oleh karena itu file tambahan ditemukan dan akan checksummed ...
Saya tahu bahwa sebagai solusi saya dapat menyimpan checksum ke lokasi lain (direktori temp via mktemp
) atau mengecualikannya di find khusus, tetapi saya ingin memahami mengapa berperilaku seperti itu - yang menurut saya tidak berguna, misalnya jika perintah pertama akan memeriksa apakah file output sudah ada di disk, itu tidak akan pernah mendapatkan jawaban yang benar ...
sh
doa diperlukan. Perhatikan bahwa Anda perlu argumen $0
sebelumnya {}
.
tee
telah menghilang? Saya mencobanya dan berfungsi dengan baik, saya juga menekan STDOUT dengan menambahkan 1>/dev/null
. Apakah ada yang salah dengan jawabannya atau itu bug?
xargs
, itu adalah shell itu sendiri yang membuat file ini, karena sebelum perintah apa pun dijalankan terlebih dahulu shell mengarahkan ulang semua input, output dan pipa, sehingga ketikafind
mulai file output sudah ada. Gunakan-exec
sebagai gantinya:find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +