เปลี่ยนชื่อไฟล์และไดเรกทอรีด้วย find -execdir | rename
หากคุณจะเปลี่ยนชื่อทั้งไฟล์และไดเรกทอรีไม่ใช่เพียงแค่คำต่อท้ายนี่เป็นรูปแบบที่ดี:
PATH="$(echo "$PATH" | sed -E 's/(^|:)[^\/][^:]*//g')" \
find . -depth -execdir rename 's/findme/replaceme/' '{}' \;
น่ากลัว-execdir
ตัวเลือกที่ไม่ได้cd
ลงในไดเรกทอรีก่อนดำเนินการคำสั่งซึ่งแตกต่างจากrename
-exec
-depth
ตรวจสอบให้แน่ใจว่าการเปลี่ยนชื่อเกิดขึ้นครั้งแรกกับเด็ก ๆ และจากนั้นในผู้ปกครองเพื่อป้องกันปัญหาที่อาจเกิดขึ้นกับไดเรกทอรีหลักที่ขาดหายไป
-execdir
จำเป็นต้องมีเนื่องจากการเปลี่ยนชื่อเล่นได้ไม่ดีกับเส้นทางเข้าที่ไม่ใช่ชื่อไฟล์เช่นต่อไปนี้ล้มเหลว:
rename 's/findme/replaceme/g' acc/acc
การPATH
แฮ็คเป็นสิ่งจำเป็นเนื่องจาก-execdir
มีข้อเสียเปรียบที่น่ารำคาญอย่างหนึ่ง: find
มีความเห็นอย่างมากและปฏิเสธที่จะทำอะไรด้วย-execdir
หากคุณมีเส้นทางญาติในPATH
ตัวแปรสภาพแวดล้อมของคุณเช่น./node_modules/.bin
ล้มเหลวด้วย:
find: พา ธ สัมพัทธ์ './node_modules/.bin' รวมอยู่ในตัวแปรสภาพแวดล้อม PATH ซึ่งไม่ปลอดภัยเมื่อใช้ร่วมกับการดำเนินการ -execdir ของการค้นหา โปรดลบรายการนั้นออกจาก $ PATH
ดูเพิ่มเติมที่: https://askubuntu.com/questions/621132/why-using-the-execdir-action-is-insecure-for-directory-which-is-in-the-path/1109378#1109378
-execdir
เป็น GNU พบส่วนขยายไปยัง POSIX rename
เป็นภาษา Perl และมาจากrename
แพ็คเกจ ทดสอบใน Ubuntu 18.10
เปลี่ยนชื่อวิธีแก้ปัญหา lookahead
หากเส้นทางอินพุตของคุณไม่ได้มาจากfind
หรือหากคุณมีความรำคาญในเส้นทางสัมพัทธ์เพียงพอเราสามารถใช้ Perl lookahead เพื่อเปลี่ยนชื่อไดเรกทอรีอย่างปลอดภัยใน:
git ls-files | sort -r | xargs rename 's/findme(?!.*\/)\/?$/replaceme/g' '{}'
ฉันไม่พบอะนาล็อกที่ใช้งานได้ง่าย-execdir
ด้วยxargs
: Xargs: เปลี่ยนไดเรกทอรีการทำงานเป็นพา ธ ไฟล์ก่อนดำเนินการ
sort -r
เป็นสิ่งจำเป็นเพื่อให้มั่นใจว่าไฟล์มาหลังจากไดเรกทอรีของตนตั้งแต่เส้นทางอีกต่อมาหลังจากที่คนสั้นด้วยคำนำหน้าเดียวกัน
rename
หรือ Red Hatrename
หรือไม่