ตามคำถามก่อนหน้าของฉันหากฉันมีหลายไฟล์ในแบบฟอร์ม
sw.ras.001
sw.ras.002
sw.ras.003
…
ฉันสามารถใช้คำสั่งใดเพื่อลบไฟล์ที่ras.
อยู่ตรงกลางของไฟล์ทั้งหมดได้อย่างไร
\.
ในรูปแบบ
ตามคำถามก่อนหน้าของฉันหากฉันมีหลายไฟล์ในแบบฟอร์ม
sw.ras.001
sw.ras.002
sw.ras.003
…
ฉันสามารถใช้คำสั่งใดเพื่อลบไฟล์ที่ras.
อยู่ตรงกลางของไฟล์ทั้งหมดได้อย่างไร
\.
ในรูปแบบ
คำตอบ:
คุณสามารถทำได้ด้วยการปรับเปลี่ยนคำตอบเล็กน้อยจากคำถามสุดท้าย:
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.
คำสั่งจึงเปลี่ยนชื่อไฟล์ชื่อเดียวกันลบ โปรดทราบว่าด้วยการค้นหาและแทนที่.
นี้จะใช้ตัวอักษรไม่ใช่ตัวอักษรพิเศษ
ตัวเลือกอื่นคือการใช้ mmv (Mass MoVe และเปลี่ยนชื่อ):
mmv '*ras.*' '#1#2'
อย่าลืมใช้เครื่องหมายคำพูดเดี่ยว ๆ รอบลวดลายของคุณมิฉะนั้นดาวจะขยายออกไปที่ระดับเปลือก
ยูทิลิตีนี้ไม่สามารถใช้งานได้ตลอดเวลา แต่หากยังไม่มีคุณสามารถติดตั้งได้ด้วย:
sudo apt-get install mmv
ในเปลือก 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:]]
ฉันเพิ่งจะเปลี่ยนชื่อเป็นจำนวนมากของไฟล์จำนวนหนึ่งซึ่งฉันต้องแทนที่การเกิดขึ้นครั้งสุดท้ายของตัวละครที่ตัวละครเกิดขึ้นหลายครั้งในชื่อไฟล์ ในกรณีพิเศษนี้ฉันต้องแทนที่ขีดสุดท้าย-
ด้วยการขีดล่าง_
โดยหมุนสิ่งนี้:
some-long-file-name.ext
เป็นนี้
some-long-file_name.ext
ใช้เวลาพอสมควร แต่ในที่สุดก็ทำเช่นนี้:
for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done
ที่นี่:
${i%-*}
ตรงกับจุดเริ่มต้นของชื่อไฟล์จนถึงเหตุการณ์ล่าสุดของเส้นประ -
${file##*-}
ตรงกับส่วนที่เหลือของชื่อไฟล์หลังจากการเกิดขึ้นครั้งสุดท้ายของเส้นประ -
ras
คือจบลงด้วยsw..001
หรือras.
ทิ้งsw.001
?