ส่งอาร์กิวเมนต์ xargs เป็นสตริงไปยังคำสั่งอื่นด้วย '>'


9

/tmp/สมมติว่าฉันมีพวงของไฟล์ใน

ฉันทำ

find . -type f | xargs -iFILES

และฉันต้องการที่จะทำmd5sumในแต่ละไฟล์ส่งออกไปยังไฟล์ที่มีชื่อเดียวกัน แต่มี.md5นามสกุล

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

นี่ควรจะสร้างไฟล์ md5 สำหรับแต่ละไฟล์ที่พบโดยคำสั่ง find แต่จะสร้างไฟล์ FILES.md5 ไฟล์เดียวบนดิสก์ที่มี checksums จากไฟล์ทั้งหมด

ฉันจะบอกคำสั่ง md5sum ได้อย่างไรว่า FILES เป็นตัวแทนของชื่อไฟล์ปัจจุบันและไม่ใช่สตริงตัวอักษร FILES

คำตอบ:


4

คุณต้องการวิธีที่จะบอกว่าคุณต้องการส่งออกmd5sumไปยังไฟล์ เนื่องจากfind(หรือxargs) ไม่มีฟังก์ชันการทำงานในตัวและmd5sumรู้วิธีพิมพ์ไปยังเอาต์พุตมาตรฐานเท่านั้นการเปลี่ยนเส้นทางเชลล์จึงเป็นวิธีที่ง่ายที่สุด

โปรดทราบว่าคำสั่งของคุณจะไม่ทำงานในกรณีทั่วไปด้วยเหตุผลอื่น: รูปแบบการส่งออกของfindไม่ได้เป็นรูปแบบการป้อนข้อมูลของพวกเขาแตกต่างกับชื่อไฟล์ที่มีช่องว่างหรือxargs \"'ใช้find -execแทน

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;

7

คุณต้องใช้ subshell เพื่อจัดการการเปลี่ยนเส้นทาง IO:

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

5

ด้วย GNU Parallel คุณสามารถทำได้:

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

คุณจะได้รับประโยชน์เพิ่มเติมจากการใช้ md5sum แบบขนานและไฟล์ที่ต้องการ:

My brother's 12" records.txt

จะไม่ทำให้คำสั่งของคุณขัดข้อง ดูวิดีโอแนะนำเพื่อเรียนรู้เพิ่มเติม: http://www.youtube.com/watch?v=OpaiGYxkSuQ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.