ฉันจะเปลี่ยนชื่อหลายไฟล์โดยการลบอักขระหรือสตริงได้อย่างไร


21

ตามคำถามก่อนหน้าของฉันหากฉันมีหลายไฟล์ในแบบฟอร์ม

sw.ras.001
sw.ras.002
sw.ras.003
…

ฉันสามารถใช้คำสั่งใดเพื่อลบไฟล์ที่ras.อยู่ตรงกลางของไฟล์ทั้งหมดได้อย่างไร


คุณต้องการที่จะลบเฉพาะrasคือจบลงด้วยsw..001หรือras.ทิ้งsw.001?
Kevin

ฉันอาจต้องการลบ 'ras' คำสั่งจะแตกต่างกันมาก
Paul

ไม่เพียงแค่คุณใส่\.ในรูปแบบ
Kevin

คำตอบ:


35

คุณสามารถทำได้ด้วยการปรับเปลี่ยนคำตอบเล็กน้อยจากคำถามสุดท้าย:

rename s/ras\.// sw.ras.*

หรือ

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

คำอธิบาย:

renameเป็นperlสคริปต์ที่ใช้perlนิพจน์ทั่วไปและรายการไฟล์ใช้ regex กับชื่อไฟล์แต่ละชื่อและเปลี่ยนชื่อแต่ละไฟล์เป็นผลลัพธ์ของการใช้ regex ในกรณีของเราrasมีการจับคู่ตามตัวอักษรและ\.ตรงตามตัวอักษร.( .ตามลำพังบ่งบอกถึงตัวละครอื่น ๆ ที่นอกเหนือจากการขึ้นบรรทัดใหม่) และมันแทนที่ด้วยไม่มีอะไร

การforวนรอบใช้ไฟล์ทั้งหมดที่ขึ้นต้นด้วยsw.ras.(เชลล์มาตรฐาน glob) และวนรอบไฟล์เหล่านั้น ${var/search/replace}ค้นหา$varสำหรับsearchและแทนที่เกิดขึ้นครั้งแรกที่มีreplaceเพื่อให้${file/ras./}ผลตอบแทน$fileกับครั้งแรกที่ras.เอาออก ras.คำสั่งจึงเปลี่ยนชื่อไฟล์ชื่อเดียวกันลบ โปรดทราบว่าด้วยการค้นหาและแทนที่.นี้จะใช้ตัวอักษรไม่ใช่ตัวอักษรพิเศษ


คุณช่วยอธิบายคำตอบของคุณให้ผู้อื่นเรียนรู้ได้จากไหน? "s / ras \ .// sw.ras. *" ทำอะไร ฉันเดาว่าฉันรู้ แต่ฉันต้องการให้แน่ใจและอื่น ๆ สามารถเรียนรู้ได้เช่นกัน ตัวเลือกที่สองในลักษณะเดียวกัน
H_7

1
@ H_7 เป็นความคิดที่ดีฉันได้เพิ่มคำอธิบายแล้ว
Kevin

14

ตัวเลือกอื่นคือการใช้ mmv (Mass MoVe และเปลี่ยนชื่อ):

mmv '*ras.*' '#1#2'

อย่าลืมใช้เครื่องหมายคำพูดเดี่ยว ๆ รอบลวดลายของคุณมิฉะนั้นดาวจะขยายออกไปที่ระดับเปลือก

ยูทิลิตีนี้ไม่สามารถใช้งานได้ตลอดเวลา แต่หากยังไม่มีคุณสามารถติดตั้งได้ด้วย:

sudo apt-get install mmv

ดูหน้าคนที่นี่


1
นั่นเป็นเครื่องมือที่ยอดเยี่ยม !!!
คริสเตียน

5

ในเปลือก POSIX สอดคล้อง ( bash, dash, kshฯลฯ ):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

หรือด้วยrename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

ฉันเพิ่งจะเปลี่ยนชื่อเป็นจำนวนมากของไฟล์จำนวนหนึ่งซึ่งฉันต้องแทนที่การเกิดขึ้นครั้งสุดท้ายของตัวละครที่ตัวละครเกิดขึ้นหลายครั้งในชื่อไฟล์ ในกรณีพิเศษนี้ฉันต้องแทนที่ขีดสุดท้าย-ด้วยการขีดล่าง_โดยหมุนสิ่งนี้:

some-long-file-name.ext

เป็นนี้

some-long-file_name.ext

ใช้เวลาพอสมควร แต่ในที่สุดก็ทำเช่นนี้:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

ที่นี่:

  • ${i%-*} ตรงกับจุดเริ่มต้นของชื่อไฟล์จนถึงเหตุการณ์ล่าสุดของเส้นประ -
  • ${file##*-} ตรงกับส่วนที่เหลือของชื่อไฟล์หลังจากการเกิดขึ้นครั้งสุดท้ายของเส้นประ -
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.