วิธีการเปลี่ยนชื่อไฟล์หลาย ๆ ไฟล์โดยแทนที่ word ในชื่อไฟล์?


36

เปลี่ยน ACDC เป็น AC-DC

ตัวอย่างเช่นเรามีไฟล์เหล่านี้

ACDC - Rock N 'Roll ไม่ใช่มลพิษทางเสียง

ACDC - Rocker.xxx

ACDC - Shoot To Thrill.xxx

ฉันต้องการให้พวกเขาเป็น:

AC-DC - Rock N 'Roll ไม่ก่อให้เกิดมลภาวะทางเสียง xxx

AC-DC - Rocker.xxx

AC-DC - Shoot To Thrill.xxx

ฉันรู้ว่า sed หรือ awk ใช้สำหรับการดำเนินการนี้ ฉันไม่สามารถ google อะไรดังนั้นฉันขอความช่วยเหลือจากคุณ =) คุณช่วยกรุณาให้คำสั่งเชลล์ทำงานเต็มสำหรับงานนี้หรือไม่?

ข้อคิดเห็น: โซลูชันสำหรับผู้ใช้ OSX


1
ฉันรู้สึกว่ามีคำถามที่ใหญ่กว่าที่นี่ - คุณพยายามแก้ไขชื่อไฟล์ mp3 โดยทั่วไปหรือไม่? มีสคริปต์จำนวนมากที่ผู้คนเขียนในช่วงหลายปีที่ผ่านมาเพื่อทำสิ่งนี้ ฉันคิดว่าชื่อที่ฉันเคยใช้ถูกเรียกmp3fixerมา
Phil Hollenback

ไม่มีมันไม่เกี่ยวกับ mp3 ของฉันเพียงแค่มีการจัดการไฟล์ขนาดใหญ่บางคนที่มีชื่อคล้ายกันและสิ่งที่ทุกอย่างจะต้องถูกแทนที่หรือคง ... สถานการณ์ทั่วไปดังนั้นผมจึงต้องแก้ปัญหานี้ดีสำหรับการเปลี่ยนชื่อทั้งหมดของพวกเขา
Holms

คำตอบ:


45
rename 's/ACDC/AC-DC/' *.xxx

จาก man rename

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the 
first argument.  The perlexpr argument is a Perl expression which is expected to modify the 
$_ string in Perl for at least some of the filenames specified.  If a given filename is not 
modified by the expression, it will not be renamed.  If no filenames are given on
           the command line, filenames will be read via standard input.

ตัวอย่างเช่นหากต้องการเปลี่ยนชื่อไฟล์ทั้งหมดที่ตรงกับ "* .bak" เพื่อตัดส่วนขยายออกคุณอาจพูดว่า

rename 's/\.bak$//' *.bak

หากต้องการแปลชื่อตัวพิมพ์ใหญ่ให้ต่ำลงคุณจะต้องใช้

rename 'y/A-Z/a-z/' *

5
โปรดทราบว่าเครื่อง linux จำนวนมากมาพร้อมกับการเปลี่ยนชื่อจาก util-linux ซึ่งใช้การทดแทนอย่างง่ายไม่ใช่ regexes ดังนั้นหากเปลี่ยนชื่อล้มเหลวอย่างเงียบ ๆ renameโดยไม่ทำอะไรคุณอาจใช้ที่ไม่ถูกต้อง
Phil Hollenback

ฉันกำลังค้นหาสิ่งนี้สำหรับทุกวัย! ขอบคุณ!
Holms

@PhilHollenback วิธีการค้นหา / ติดตั้งที่เหมาะสมแล้ว? :)
เฮ

ใช้งานไม่ได้เมื่อฉันขีดเส้นใต้ในชื่อไฟล์แทนที่จะเว้นวรรค - ฉันจะแก้ไขได้อย่างไร
ยกเลิก

13

คำตอบนี้มีส่วนที่ดีจากคำตอบอื่น ๆ ls | while readทั้งหมดในขณะที่ออกจากบาปเช่น

ไดเรกทอรีปัจจุบัน:

for file in ACDC*.xxx; do
    mv "$file" "${file//ACDC/AC-DC}"
done

รวมถึงไดเรกทอรีย่อย:

find . -type f -name "ACDC*" -print0 | while read -r -d '' file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

ตัวอักษรขึ้นบรรทัดใหม่มีจริงๆไม่น่าจะมีในชื่อไฟล์ดังนั้นนี้สามารถจะง่ายขณะที่ยังคงทำงานร่วมกับชื่อที่มีช่องว่าง:

find . -type f -name "ACDC*" | while read -r file; do
    mv "$file" "${file//ACDC/AC-DC}"
done

9

หากต้องการใช้เวอร์ชัน util-linux ของrenamePhil ที่อ้างถึง (บน Ubuntu มันเรียกว่าrename.ul):

rename ACDC AC-DC ACDC*

หรือ

rename.ul ACDC AC-DC ACDC*

1
ตัวแปรของคุณดีที่สุด =) บทความโง่ ๆ มากมายใน google เกี่ยวกับการค้นหาและส่งและ awk ... กับการดำเนินการอย่างง่าย ๆ นี้ซึ่งมีการเปลี่ยนชื่อ egxist แล้ว!
holms

4

ใช้เปลือก bash

find . -type f -name "ACDC*" -print0 | while read -d $'\0' f
do
   new=`echo "$f" | sed -e "s/ACDC/AC-DC/"`
   mv "$f" "$new"
done

หมายเหตุ: การใช้findจะประมวลผลไดเรกทอรีปัจจุบันและไดเรกทอรีภายใต้


1

ขึ้นอยู่กับเปลือกของคุณ ใน zsh ฉันจะทำสิ่งนี้:

for file in ACDC*.xxx; do
    mv "$file" "$(echo $file | sed -e 's/ACDC/AC-DC/')"
done

อาจไม่ใช่ทางออกที่ดีที่สุด แต่ใช้ได้


1

ใช้ทุบตี:

ls *.xxx | while read fn; do
    mv "${fn}" "${fn/ACDC/AC-DC}";
done

หากคุณrenameติดตั้งโปรแกรมแล้ว:

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