ต่อไปนี้เป็นการแก้ไขแนวทางของคุณโดยตรง:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
อย่างไรก็ตามสิ่งนี้มีราคาแพงมากหากคุณมีไฟล์ที่จับคู่จำนวนมากเนื่องจากคุณเริ่มเชลล์สด (ที่เรียกใช้งาน a mv
) สำหรับการแข่งขันแต่ละครั้ง และถ้าคุณมีตัวละครตลกในชื่อไฟล์สิ่งนี้จะระเบิด แนวทางที่มีประสิทธิภาพและปลอดภัยยิ่งขึ้นคือ:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
นอกจากนี้ยังมีประโยชน์ในการทำงานกับไฟล์ที่มีชื่อแปลก ๆ หากfind
รองรับมันสามารถลดได้ถึง
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs
รุ่นจะเป็นประโยชน์เมื่อไม่ได้ใช้งาน{}
ในขณะที่
find .... -print0 | xargs --null rm
ที่นี่rm
จะถูกเรียกหนึ่งครั้ง (หรือมีหลายไฟล์หลายครั้ง) แต่ไม่ใช่สำหรับทุกไฟล์
ฉันออกbasename
ในคำถามคุณเพราะมันอาจจะเป็นความผิดที่คุณจะย้ายfoo/bar/file8
ไปไม่ได้file8_renamed
foo/bar/file8_renamed
การแก้ไข (ตามที่แนะนำในความคิดเห็น):
- เพิ่มสั้นลง
find
โดยไม่ต้องxargs
- เพิ่มสติกเกอร์ความปลอดภัย
x
ไม่มีประโยชน์:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
รุ่นมีประสิทธิภาพเช่นเดียวกับตัวอย่างแรก /