จะลบตัวอักษรต่อท้ายในชื่อไฟล์ใน Bash ได้อย่างไร?


13

ฉันมีไฟล์มีเดียมากมายเช่นเดียวกับที่อยู่ด้านล่าง:

tvshow.s01e11]Bloodlines.avi
tvshow.s01e12]suffer.avi
tvshow.s01e13]NotMe.avi

ฉันต้องการเปลี่ยนชื่อพวกเขาเป็น

tvshow.s01e11.avi
tvshow.s01e12.avi
tvshow.s01e13.avi

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


หากคุณต้องการทำสิ่งนี้ใน gui krenameน่ารัก มันมีตัวเลือกที่ทรงพลังทุกประเภทและแสดงให้คุณเห็นว่ามันจะทำอะไรก่อนที่มันจะทำ คุณสามารถใช้มันเพื่อทดสอบรูปแบบที่คุณสามารถใช้ในการทุบตีในภายหลัง
โจ

คำตอบ:


9

นี่จะเปลี่ยนชื่อไฟล์ คุณต้องการ \ w * เพื่อบ่งบอกถึงจำนวนตัวอักษรและตัวเลข

rename 's/\]\w*//' *

การอ้างอิง: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#UsingSimpleWildcards


5
โปรดทราบว่านี้ต้อง Perl renameยูทิลิตี้ไม่ได้เป็นหนึ่งที่มีชื่อเดียวกันจาก util ดูที่นี่และที่นี่
ilkkachu

14

ในเปลือกหนึ่งสามารถทำได้ง่ายๆ:

for x in *]*.avi ; do 
    mv -i "$x" "${x%]*.avi}.avi"
done

เปลือกสามารถผลิตรายการของชื่อไฟล์ที่มีเพียง glob ปกติและ ${var%pattern}เอา (ที่สั้นที่สุด) varจับคู่รูปแบบจากจุดสิ้นสุดของสตริงในตัวแปร ตั้งแต่นามสกุลสุดท้ายอยู่เสมอ.aviฉันเพิ่งลบออกด้วยรูปแบบและเพิ่มกลับ ด้วยเครื่องหมายคำพูดสิ่งนี้ควรทำงานกับชื่อไฟล์ที่มีช่องว่างเช่นกันFancy Name for a Show.s01e01]Asdf.avi


@NoviceC รูปแบบ extglob ไม่ใช่ความคิดที่ไม่ดี ที่จริงแล้วสิ่งที่${x/]*([^.])}ควรทำก็คือลบวงเล็บและจำนวนจุดที่ไม่ใช่ (แม้ว่าจะล้มเหลวหากมีเครื่องหมายวงเล็บหรือจุดอื่น ๆ เนื่องจากไม่ได้ล็อคไว้ที่ส่วนท้ายของสตริง)
ilkkachu

นั่นเป็นจุดที่ดี แต่ฉันเพิ่งจะซับซ้อนมากเกินไปปัญหาเมื่อฉันควรจะไปด้วย${x/]*.avi}และเพิ่งเพิ่ม.aviเช่นคุณ แต่ฉันก็ไม่พอใจเช่นกันว่าช่องว่างในชื่อจะแตก(`find . -name '*]*.avi'`)ได้อย่างไร ฉันมีความสุขที่ได้จัดเตรียมคำสั่ง unix มาตรฐานที่ จำกัด เนื่องจากการเปลี่ยนชื่อไม่ใช่ แต่สิ่งนี้ทำให้ฉันระเบิดออกจากน้ำ
สามเณร C

2

นี่เป็นสิ่งที่ทำไม่ได้ทุกอย่าง - คำตอบอื่น ๆ นั้นเร็วกว่าและสั้นกว่ามาก - แต่ ...

คุณสามารถใช้ PowerShell! Microsoft เปิดแหล่งที่มาเมื่อเร็ว ๆ นี้และทำให้เป็นข้ามแพลตฟอร์ม สำหรับการดาวน์โหลดและคำแนะนำสำหรับการติดตั้งระบบปฏิบัติการของคุณให้ดูส่วน "รับ PowerShell"

เมื่อคุณติดตั้งแล้วคุณสามารถใช้สคริปต์สั้น ๆ นี้:

Get-ChildItem -File '*]*.avi' | ForEach-Object {
    Rename-Item $_ -NewName (($_.Name -Split ']')[0] + '.avi')
}

โดยทั่วไปมันจะผ่านแต่ละวัตถุในไดเรกทอรีปัจจุบันที่เป็นการจับคู่ไฟล์*]*.aviรับส่วนก่อนวงเล็บปีกกา tacks .aviกลับมาและกำหนดว่าเป็นชื่อใหม่

หากต้องการเรียกใช้โดยตรงจาก Bash ให้ใช้สายการบินเดียวแบบซับ - กอล์ฟ:

powershell -command $'gci -File \'*]*.avi\'|%{rename-item $_ -NewName (($_.Name -Split \']\')[0]+\'.avi\')}'

พูดหลบหนีมารยาทของคำตอบนี้กองมากเกิน

(ทดสอบใน Bash บน Ubuntu บน Windows อาจมีวิธีที่สั้นกว่ามากในการทำกับ PowerShell แต่ฉันต้องการแสดงสิ่งที่เข้าใจได้สำหรับผู้ที่ไม่รู้จักการแสดงออกปกติ)


Rube Goldberg จะภูมิใจ! Regexes เป็น PITA ที่แท้จริงในการเรียนรู้ แต่พวกเขาก็คุ้มค่าหลายต่อหลายครั้ง - แม้ในระดับพื้นฐานที่ฉันสามารถใช้งานได้
โจ

1

Debian มีแพ็คเกจชื่อmmvซึ่งอาจมีอยู่ใน distros อื่น ๆ และควรจะง่ายพอที่จะคอมไพล์จากซอร์สถ้าไม่ อนุญาตให้คุณเขียนสิ่งนี้:

mmv '*]*.avi' '#1.avi'

คุณสามารถอ่านหน้า man ของ Ubuntuสำหรับคำสั่งนี้สำหรับรายละเอียดเพิ่มเติม


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