Linux เปลี่ยนชื่อไฟล์แบบเรียกซ้ำเท่านั้น


1

ฉันพยายามเปลี่ยนชื่อไฟล์ทั้งหมดซ้ำภายในไดเรกทอรีและไดเรกทอรีย่อยเป็นตัวพิมพ์เล็ก แต่เปลี่ยนชื่อไดเรกทอรีไม่เปลี่ยนแปลง

ตัวอย่างทั้งหมดที่ฉันได้พบเปลี่ยนชื่อทั้งไฟล์และไดเรกทอรีเป็นตัวพิมพ์เล็กเช่น:

find ./ -depth -exec rename -n 'y/[A-Z]/[a-z]/' {} ";"

และ

find . -type f|while read f; do mv "$f" "$(echo $f|tr '[:upper:]' '[:lower:]')"; done

ฉันจะเก็บไดเรคทอรีไม่เปลี่ยนแปลง แต่เปลี่ยนชื่อไฟล์ทั้งหมดได้อย่างไร?


ปัญหาที่สองคืออะไร -type fแสดงรายการไฟล์ปกติเท่านั้น ไดเรกทอรีไม่ได้อยู่ในรายการ

1
คุณยังสามารถเพิ่มคำสั่ง-type fแรกfindให้กับฉันซึ่งเป็นวิธีที่ง่ายที่สุดชัดเจนและง่ายต่อการจดจำมากขึ้น
The Peach

คำตอบ:


2

คุณได้รับการเปลี่ยนชื่อชื่อไดเรกทอรีเนื่องจากfindคำสั่งส่งคืนพา ธ เต็มของชื่อไฟล์จากนั้นคำสั่งเปลี่ยนชื่อเสร็จสิ้นการเปลี่ยนชื่อฐานในชื่อไดเรกทอรี ดังนั้นหากคุณมีไฟล์ในไดเรกทอรีDIR1/FILEมันจะถูกเปลี่ยนชื่อเป็นdir1/fileในขณะที่คุณไม่ต้องการเปลี่ยนชื่อไดเรกทอรี

นี่คือคำสั่งสำหรับการเปลี่ยนชื่อไฟล์ชื่อเท่านั้น:

find . -type f -exec rename -n 's:([^/]*$):lc($1):e' {} +

ในคำสั่งด้านบน([^/]*$)จับคู่เฉพาะส่วนสุดท้ายของเส้นทางที่ไม่มี/วงเล็บในคู่(...)ซึ่งทำให้ส่วนที่จับคู่เป็นกลุ่มของการจับคู่ จากนั้นแปลส่วนที่จับคู่ ( $1คือดัชนีของกลุ่มที่จับคู่แรก) เป็นตัวพิมพ์เล็กพร้อมlc()ฟังก์ชัน

ที่คุณต้องขี่-nตัวเลือกในการเปลี่ยนชื่อไฟล์จริง

-exec ... {} +สำหรับคำสั่งที่สามารถใช้เวลามากกว่าหนึ่งไฟล์ในเวลา (เช่นcat, stat, ls) ไฟล์ที่พบโดยfindถูกผูกมัดกันเช่นxargsคำสั่ง นี่หมายถึงการฟอร์กออกน้อยกว่าและสำหรับการดำเนินการขนาดเล็กอาจหมายถึงการเร่งความเร็วอย่างมาก [ คำตอบโดย@Oli ]


สิ่งนี้ยังคงเปลี่ยนชื่อไดเรกทอรีสุดท้ายในทรีตามที่ทำซ้ำ แต่สามารถแก้ไขได้ถ้าเปลี่ยนเป็น: find -name "* .type" - เปลี่ยนชื่อของ: ([^ /] * $): lc ($ 1): e '{} +

@DonSmythe -type fเอ่อฉันพลาดที่ถูกต้อง คงที่ ขอบคุณ.
αғsнιη
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.