ฉันค่อนข้างใหม่กับ Bash และฉันพยายามทำบางสิ่งที่บนพื้นผิวนั้นค่อนข้างตรงไปตรงมา - ลองค้นหาลำดับชั้นของไดเรกทอรีเพื่อรับไฟล์ * .wma ทั้งหมดไปป์ที่เอาต์พุตไปยังคำสั่งที่ฉันแปลงเป็น mp3 และ บันทึกไฟล์ที่แปลงเป็น. mp3 ฉันคิดว่าคำสั่งควรมีลักษณะดังต่อไปนี้ (ฉันได้ละทิ้งคำสั่งการแปลงเสียงและฉันใช้ echo แทนภาพประกอบ):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
ตามที่ฉันเข้าใจแล้ว -print0 arg จะให้ฉันจัดการกับชื่อไฟล์ที่มีช่องว่าง ฉันคาดหวังว่า (เนื่องจาก xargs) ว่าแต่ละพา ธ ไฟล์จาก find ถูกดักจับใน f และการใช้ซับสตริงจับคู่ / ลบจากจุดสิ้นสุดของสตริงนั้นฉันควรจะสะท้อนพา ธ ไฟล์ดั้งเดิมด้วย mp3 ส่วนขยายแทน wma อย่างไรก็ตามแทนที่จะเป็นผลลัพธ์นี้ฉันเห็นสิ่งต่อไปนี้:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
ดังนั้นคำถามของฉัน (นอกเหนือจาก 'สิ่งที่ฉันทำผิดที่นี่') คือสิ่งนี้ - ทำค่าที่เป็นผลลัพธ์ของการดำเนินการไปป์จำเป็นต้องได้รับการปฏิบัติที่แตกต่างกันในการดำเนินการจัดการสตริงที่แตกต่างจากการกำหนดตัวแปร ?
{}
สมาชิก)
xargs
exec
ดู stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargsสำหรับกรณีและปัญหา
xargs
find
มันมาพร้อมกับ-exec
ตัวเลือก คุณสามารถเพิ่มคำสั่งที่คุณจะใช้กับคำถามของคุณและใครบางคนสามารถแสดงfind
คำสั่งที่ถูกต้องให้คุณได้หรือไม่?