ฉันมีโฟลเดอร์ที่มีชุดไฟล์ชื่อ:
prefix_1234_567.png
prefix_abcd_efg.png
ฉันต้องการแบทช์ลบขีดล่างและเนื้อหาตรงกลางออกหนึ่งรายการดังนั้นผลลัพธ์จะเป็น:
prefix_567.png
prefix_efg.png
เกี่ยวข้อง แต่ไม่สามารถอธิบายได้อย่างสมบูรณ์:
_*_ด้วยช่องว่าง
ฉันมีโฟลเดอร์ที่มีชุดไฟล์ชื่อ:
prefix_1234_567.png
prefix_abcd_efg.png
ฉันต้องการแบทช์ลบขีดล่างและเนื้อหาตรงกลางออกหนึ่งรายการดังนั้นผลลัพธ์จะเป็น:
prefix_567.png
prefix_efg.png
เกี่ยวข้อง แต่ไม่สามารถอธิบายได้อย่างสมบูรณ์:
_*_ด้วยช่องว่าง
คำตอบ:
ในกรณีเฉพาะของคุณคุณสามารถใช้bashคำสั่งต่อไปนี้( bashคือเชลล์เริ่มต้นบน macOS):
for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
หมายเหตุ: หากมีโอกาสที่ชื่อไฟล์ของคุณจะขึ้นต้นด้วย-ให้วางไว้ข้าง-- หน้า [1]:
mv -- "$f" "${f/_*_/_}"
หมายเหตุ: echoอยู่ข้างหน้าmvเพื่อดำเนินการแบบแห้ง ลบออกเพื่อทำการเปลี่ยนชื่อจริง
คุณสามารถเรียกใช้จากบรรทัดคำสั่งหรือใช้ในสคริปต์
"${f/_*_/_}"เป็นแอปพลิเคชันของbash การขยายพารามิเตอร์ : รูปแบบการจับคู่สตริงย่อย (แรก) _*_ถูกแทนที่ด้วยลิเทอรั_ลตัดโทเค็นกลางออกจากชื่อได้อย่างมีประสิทธิภาพ_*_เป็นรูปแบบ (นิพจน์ตัวแทนเช่นเดียวกับที่ใช้สำหรับ globbing) ไม่ใช่นิพจน์ทั่วไป (เพื่อเรียนรู้เกี่ยวกับรูปแบบเรียกใช้man bashและค้นหาPattern Matching)หากคุณพบว่าตัวเองไฟล์ชุดเปลี่ยนชื่อบ่อยพิจารณาติดตั้งเครื่องมือพิเศษเช่น Perl-basedrenameยูทิลิตี้ บน macOS คุณสามารถติดตั้งได้โดยใช้Homebrewตัวจัดการแพ็คเกจยอดนิยมดังต่อไปนี้:
brew install rename
นี่คือคำสั่งที่เทียบเท่ากับด้านบนโดยใช้rename:
rename -n -e 's/_.*_/_/' *.png
อีกครั้งคำสั่งนี้ดำเนินการแบบแห้ง ลบ-nเพื่อทำการเปลี่ยนชื่อจริง
bashวิธีการแก้ปัญหาs/.../.../เปลี่ยนตัวข้อความดำเนินการ แต่ - แตกต่างจากในbash- จริงการแสดงออกปกติจะใช้[1] วัตถุประสงค์ของการโต้แย้งพิเศษ--ซึ่งได้รับการสนับสนุนโดยสาธารณูปโภคมากที่สุดคือการส่งสัญญาณว่าข้อโต้แย้งที่ตามมาควรจะถือว่าเป็นตัวถูกดำเนินการ (ค่า) ถึงแม้ว่าพวกเขามีลักษณะเหมือนตัวเลือกเนื่องจากการเริ่มต้นด้วยการ-เป็นจาค็อบซีบันทึก
.*-> $1) เช่นเปลี่ยนชื่อFoo bar S01E01 biz baz.extเป็นS01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
echoสำหรับการวิ่งแบบแห้ง ขอบคุณสำหรับทิป!
brew install rename
ในการเปลี่ยนชื่อไฟล์คุณสามารถใช้renameยูทิลิตี้:
brew install rename
ตัวอย่างเช่นในการเปลี่ยนสตริงการค้นหาในชื่อไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบัน:
rename -nvs searchword replaceword *
ลบพารามิเตอร์ 'n' เพื่อใช้การเปลี่ยนแปลง
ข้อมูลเพิ่มเติม: man rename
OS Xเวอร์ชันของGNU bash( x86_64-apple-darwin ) ไม่รวมยูทิลิตี้การเปลี่ยนชื่อ
brew install rename
rename -vs GLYCOPHORIN GLYCC *และตอนนี้มันเปลี่ยนชื่อไฟล์ 450+ โดยอัตโนมัติ และเร็วสุด ๆ ด้วย.
คุณสามารถใช้ sed:
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
ผลลัพธ์:
prefix_567.png prefix_efg.png
* ในการทำ dry-run ก่อนให้แทนที่mvในตอนท้ายด้วยecho
คำอธิบาย:
ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'(ลบechoเพื่อเปลี่ยนชื่อจริง)
ฉันมีชุดไฟล์ที่มีลักษณะเช่นนี้: be90-01.png และจำเป็นต้องเปลี่ยนเส้นประเป็นขีดล่าง ฉันใช้สิ่งนี้ซึ่งได้ผลดี:
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
คุณสามารถติดตั้งrenameคำสั่งโดยใช้brew. เพียงแค่ทำbrew install renameและใช้มัน
การใช้ mmv
mmv '*_*_*' '#1_#3' *.png
sudo apt-get install mmvคุณต้องติดตั้งครั้งแรก
brew install mmvขั้นตอนการติดตั้งที่ถูกต้องคือ
ลองดู
for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
นี่เป็นอีกวิธีหนึ่ง:
for file in Name*.png; do mv "$file" "01_$file"; done