ฉันพยายามเรียกใช้คำสั่งคล้ายกับคำสั่งด้านล่างในสคริปต์ทุบตี มันควรจะค้นหาผ่านโฟลเดอร์ย่อยทั้งหมดและคัดลอกไฟล์ทั้งหมดของบางประเภทให้อยู่ในระดับรากของ$sourcedir
$targetdir
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
นี้ดูเหมือนว่าจะสวยใกล้เคียงยกเว้นว่า{}
จะไม่ถูกส่งผ่านไปในขณะที่$2
ไป-exec sh -c ...
ฉันต้องการทำเช่นนี้ให้ใกล้เคียงกับ "ทางที่ถูกต้อง" ที่สุดเท่าที่จะทำได้ด้วยความอดทนสำหรับตัวละครพิเศษในชื่อไฟล์
แก้ไข:ฉันเห็นคนแนะนำให้ใช้xargs
หรือการผูกมัดข้อโต้แย้ง ฉันอยู่ภายใต้การแสดงผลว่านี่เป็นเพียงข้อโต้แย้งที่ จำกัด ตัวอย่างเช่นถ้าฉันมีไฟล์. jpg หลายพันไฟล์ที่ฉันพยายามคัดลอกจากไดเรกทอรีแกลเลอรี่จำนวนมากไปยังไดเรกทอรีสไลด์โชว์ยักษ์โซลูชั่นการเชื่อมโยงจะยังคงใช้งานได้หรือไม่
แก้ไข 2:ปัญหาของฉันคือฉันหายไป_
ก่อนที่ตัวเลือกแรกของฉันที่จะดวลจุดโทษใน-exec
คำสั่ง สำหรับทุกคนที่สงสัยเกี่ยวกับวิธีทำให้คำสั่ง find ทำงานได้เพิ่ม_
และทุกอย่างจะดีขึ้น:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
ฉันยอมรับคำตอบด้านล่างแล้วว่าทำได้ดีกว่า แต่มีประสิทธิภาพและสวยงามกว่า
xargs
เคยสร้างมาเพื่อจัดการข้อโต้แย้งจำนวนมากโดยอัตโนมัติในคำสั่งปกติที่มีข้อ จำกัด นอกจากนี้เพื่อพิจารณาข้อ จำกัด สูงสุดของอาร์กิวเมนต์ส่วนใหญ่ได้รับการปรับปรุงอย่างมากสำหรับอุปกรณ์มาตรฐานของ GNU นอกจากนี้คุณยังจะได้รับประโยชน์จากประสิทธิภาพการทำงานโดยหลีกเลี่ยงการดำเนินการตามกระบวนการทั้งหมดซึ่งเกี่ยวข้องกับไฟล์นับพันที่เกี่ยวข้อง