ตามคำถามก่อนหน้าของฉันหากฉันมีหลายไฟล์ในแบบฟอร์ม
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?