find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
ฉันไม่ได้ลองสคริปต์ที่ซับซ้อนมากขึ้นที่กล่าวถึงที่นี่ แต่ไม่มี commandline version เดียวที่ทำงานให้ฉันใน Synology NAS ของฉัน rename
ไม่พร้อมใช้งานและรูปแบบต่างๆของความfind
ล้มเหลวเนื่องจากดูเหมือนจะติดกับชื่อที่เก่ากว่าของเส้นทางที่ถูกเปลี่ยนชื่อแล้ว (เช่นหาก./FOO
ตามมาด้วยการ./FOO/BAR
เปลี่ยนชื่อ./FOO
เป็น./foo
จะยังคงอยู่ในรายการต่อไป./FOO/BAR
แม้ว่าเส้นทางนั้นจะไม่ถูกต้องอีกต่อไป) . คำสั่งดังกล่าวทำงานให้ฉันโดยไม่มีปัญหาใด ๆ
สิ่งต่อไปนี้คือคำอธิบายของแต่ละส่วนของคำสั่ง:
find . -depth -name '*[A-Z]*'
นี่จะค้นหาไฟล์ใด ๆ จากไดเรกทอรีปัจจุบัน (เปลี่ยน.
เป็นไดเรกทอรีใด ๆ ที่คุณต้องการประมวลผล) โดยใช้การค้นหาความลึกก่อน (เช่นจะแสดงรายการ./foo/bar
ก่อน./foo
) แต่เฉพาะไฟล์ที่มีอักขระตัวพิมพ์ใหญ่ -name
กรองเฉพาะกับชื่อไฟล์ฐานที่ไม่เส้นทางแบบเต็ม ดังนั้นนี้จะแสดงรายการแต่ไม่./FOO/BAR
นี้ก็โอเคที่เราไม่ต้องการที่จะเปลี่ยนชื่อ./FOO/bar
./FOO/bar
เราต้องการเปลี่ยนชื่อ./FOO
แต่มีการระบุไว้ในภายหลัง (นี่คือเหตุผลที่-depth
สำคัญ)
คำสั่งนี้มีประโยชน์อย่างยิ่งในการค้นหาไฟล์ที่คุณต้องการเปลี่ยนชื่อในตอนแรก ใช้สิ่งนี้หลังจากคำสั่งเปลี่ยนชื่อเสร็จสมบูรณ์เพื่อค้นหาไฟล์ที่ยังไม่ถูกแทนที่เนื่องจากการชนกันของชื่อไฟล์หรือข้อผิดพลาด
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
ส่วนนี้จะอ่านไฟล์ที่ส่งออกโดยfind
และจัดรูปแบบพวกเขาในmv
คำสั่งโดยใช้การแสดงออกปกติ -n
ตัวเลือกหยุดsed
จากการพิมพ์การป้อนข้อมูลและp
คำสั่งในการค้นหาและแทนที่ผล regex ข้อความที่แทนที่
Regex นั้นประกอบด้วยการจับสองครั้ง: ส่วนจนถึงสุดท้าย / (ซึ่งเป็นไดเรกทอรีของไฟล์) และชื่อไฟล์เอง ไดเรกทอรีนั้นยังคงสภาพเหมือนเดิม แต่ชื่อไฟล์จะถูกเปลี่ยนเป็นตัวพิมพ์เล็ก ดังนั้นถ้าfind
เอาท์พุทก็จะกลายเป็น./FOO/BAR
ตัวเลือกในการทำให้แน่ใจว่าแฟ้มที่มีอยู่พิมพ์เล็กไม่ได้ถูกเขียนทับ ตัวเลือกที่จะทำให้การส่งออกการเปลี่ยนแปลงทุกครั้งที่มันทำให้ (หรือไม่ได้ทำให้ - ถ้ามีอยู่แล้วมันจะออกผลลัพธ์บางอย่างเช่นสังเกตว่าไม่มีการเปลี่ยนแปลงที่ได้รับการทำ) เป็นสิ่งสำคัญมากที่นี่ - มันถือว่าแฟ้มเป้าหมายเป็นไดเรกทอรี สิ่งนี้จะทำให้แน่ใจได้ว่าไม่ได้ย้ายเข้าไปในไดเรกทอรีนั้นหากมีอยู่mv -n -v -T ./FOO/BAR ./FOO/bar
-n
mv
-v
mv
./FOO/bar
./FOO/BAR -> ./FOO/BAR
-T
./FOO/BAR
./FOO/bar
ใช้สิ่งนี้ร่วมกับfind
เพื่อสร้างรายการคำสั่งที่จะถูกดำเนินการ (สะดวกในการตรวจสอบสิ่งที่จะทำโดยไม่ต้องทำจริง ๆ )
sh
คำอธิบายนี้ค่อนข้างสวย มันกำหนดเส้นทางmv
คำสั่งที่สร้างขึ้นทั้งหมดไปยังล่ามเปลือก คุณสามารถแทนที่ด้วยbash
หรือเปลือกที่คุณชื่นชอบ
ABCdef
,abcDEF
และaBcDeF
? สคริปต์การเปลี่ยนชื่อควรยกเลิกหรือเพียงแค่เตือนและดำเนินการต่อหรือไม่ 2. คุณจะกำหนดตัวพิมพ์เล็กสำหรับชื่อที่ไม่ใช่ US-ASCII ได้อย่างไร หากมีชื่อดังกล่าวอยู่ควรมีการตรวจสอบและการยกเว้นรหัสผ่านอย่างใดอย่างหนึ่งก่อนหรือไม่ 3. หากคุณใช้งานการเปลี่ยนชื่อ