Lewati argumen xargs sebagai string ke perintah lain dengan '>'?

9

Misalkan saya memiliki banyak file di /tmp/.

Saya lakukan

find . -type f | xargs -iFILES

Dan saya ingin melakukan md5sumdi setiap file, mengeluarkan ke file dengan nama yang sama, tetapi dengan .md5ekstensi.

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

Ini seharusnya membuat file md5 untuk setiap file yang ditemukan oleh perintah find. Sebagai gantinya, ia membuat file FILES.md5 tunggal pada disk dengan checksum dari semua file.

Bagaimana saya mengatakan kepada perintah md5sum bahwa FILES mewakili nama file saat ini dan bukan string literal FILES?

Seseorang masih menggunakan Anda MS-DOS
sumber

Jawaban:

4

Anda perlu beberapa cara untuk mengatakan bahwa Anda ingin mengirim output md5sumke file. Karena find(atau xargs) tidak memiliki fungsi ini built-in, dan md5sumhanya tahu cara mencetak ke output standar, pengalihan shell adalah cara yang paling mudah.

Perhatikan bahwa perintah Anda tidak akan berfungsi dalam kasus umum karena alasan lain: format output findbukan format input xargs, mereka berbeda dengan nama file yang mengandung spasi atau \"'. Gunakan find -execsebagai gantinya.

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;
Gilles 'SANGAT berhenti menjadi jahat'
sumber
7

Anda perlu menggunakan subkulit untuk menangani pengalihan IO:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'
jsbillings
sumber
5

Dengan GNU Parallel Anda dapat melakukan:

find . -type f | parallel md5sum {} \> {}.md5

Anda mendapatkan manfaat tambahan dari menjalankan md5sum secara paralel dan file-file seperti:

My brother's 12" records.txt

tidak akan menyebabkan perintah Anda mogok. Tonton video intro untuk mempelajari lebih lanjut: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Ole Tange
sumber