ฉันจะเปลี่ยนชื่อไฟล์จำนวนมากโดยใช้ regex ได้อย่างไร


20

ฉันต้องการเปลี่ยนชื่อไฟล์จำนวนมากบน Mac OS X (10.7.2) .. ฉันไม่มีแพ็คเกจสำหรับrenameคำสั่ง

ไฟล์ของฉันมีชื่อเช่น "T452-102456-0.png" และฉันต้องการลบส่วน "-0" ฉันรู้ว่าฉันสามารถทำสิ่งนี้ได้ด้วยการเขียนสคริปต์ php-cli ของฉันเอง แต่ฉันอยากรู้วิธีแก้ปัญหาที่ง่ายขึ้นและเร็วขึ้น


ไม่มีความขัดแย้งทางตรรกะระหว่าง“ ไฟล์ PDF จำนวนมาก” และ“ ไฟล์ของฉันมีชื่ออย่าง“ T452-102456-0.png”” หรือไม่
จัดการ

โอ้ ... ประเภทของไฟล์ไม่สำคัญ แต่มันเป็นเรื่องจริง ^^ ฉันแก้ไขขอขอบคุณสำหรับความคิดเห็นของคุณ =)
Raphaël

คำตอบ:


21

Bash หรือ Ksh ร่วมกับmvสามารถแก้ไขได้:

for f in *.png; do mv -n "$f" "${f/-0}"; done

ในกรณีที่ชื่อไฟล์อาจมี“ 0” หลังจากเส้นประแรกเช่นกันและ“ -0” อยู่ด้านหน้าของจุดเสมอคุณอาจต้องการรวมจุดนั้นไว้ในนิพจน์:

for f in *.png; do mv -n "$f" "${f/-0./.}"; done

แต่เนื่องจากกฎการเปลี่ยนชื่อนั้นนั้นง่ายถ้าคุณมีrenameจากแพ็คเกจutil-linuxนั่นก็จะทำเช่นกัน:

rename '-0.' '.' *.png

มันทำงานได้อย่างสมบูรณ์แบบ ขอบคุณมาก =)
Raphaël

3

วิธีการง่าย ๆ : ไฟล์ในไดเรกทอรีปัจจุบันเท่านั้น

ด้วย zsh:

autoload zmv
zmv '(*)-0(.png)' '$1$2'

กับกระสุนอื่น ๆ :

for x in *-0.png; do mv -- "$x" "${x%-0.*}.png"; done


วิธีการขั้นสูง: ไฟล์ในไดเรกทอรีปัจจุบันและ / หรือไดเรกทอรีย่อย

ด้วย zsh:

zmv '(**/)(*)-0(.png)' '$1$2$3'

ด้วย ksh93:

set -o globstar
for x in **/*-0.png; do mv -- "$x" "${x%-0.*}.png"; done

ด้วย bash ≥4ข้างต้น แต่ใช้shopt -s globstarแทนsetคำสั่ง

กับกระสุนอื่น ๆ :

find -name '*-0.png' -exec sh -c 'for x; do mv -- "$x" "${x%-0.*}.png"; done' _ {} +

อีกเหตุผลที่ดีในการติดตั้ง zsh:) .... zmv
danidee


0

หากคุณมีmmvแพ็คเกจ:

mmv '*-0.png' '#1.png'

เช่นเดียวกับ (เวอร์ชันล่าสุด) renameสิ่งนี้จะใช้ความระมัดระวังตามสมควรเพื่อหลีกเลี่ยงการเขียนทับไฟล์ที่มีอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.