ต่อไปนี้เป็นการแก้ไขแนวทางของคุณโดยตรง:
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_renamedfoo/bar/file8_renamed
การแก้ไข (ตามที่แนะนำในความคิดเห็น):
- เพิ่มสั้นลง
findโดยไม่ต้องxargs
- เพิ่มสติกเกอร์ความปลอดภัย
xไม่มีประโยชน์:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsรุ่นมีประสิทธิภาพเช่นเดียวกับตัวอย่างแรก /