ฉันจะแนะนำทางเลือกสามทาง แต่ละคำสั่งเป็นคำสั่งบรรทัดเดียวแบบง่าย ๆ แต่ฉันจะให้ชุดคำสั่งสำหรับกรณีที่ซับซ้อนมากขึ้นส่วนใหญ่ในกรณีที่ไฟล์ที่จะดำเนินการผสมกับไฟล์อื่น ๆ ในทิศทางเดียวกัน
MMV
ฉันจะใช้คำสั่ง mmv
จากแพ็คเกจชื่อเดียวกัน :
mmv '*HBO_DPM*' '#1dpm#2'
โปรดทราบว่าอาร์กิวเมนต์จะถูกส่งผ่านเป็นสตริงดังนั้นการขยายแบบ glob จะไม่เกิดขึ้นในเชลล์ คำสั่งได้รับอาร์กิวเมนต์สองตัวจากนั้นค้นหาไฟล์ที่เกี่ยวข้องภายในโดยไม่มีข้อ จำกัด ด้านจำนวนไฟล์ นอกจากนี้โปรดทราบว่าคำสั่งข้างต้นถือว่าไฟล์ทั้งหมดที่ตรงกับ glob แรกจะถูกเปลี่ยนชื่อ แน่นอนคุณมีอิสระที่จะเฉพาะเจาะจงมากขึ้น:
mmv 'sb_606_HBO_DPM_*' 'sb_606_dpm_#1'
หากคุณมีไฟล์ที่อยู่นอกช่วงหมายเลขที่ร้องขอในไดเรกทอรีเดียวกันคุณอาจจะดีกว่าถ้ามีลูปมากกว่าตัวเลขที่ให้ไว้ในคำตอบนี้ อย่างไรก็ตามคุณสามารถใช้ลำดับ mmv invocations ที่มีรูปแบบที่เหมาะสม:
mmv 'sb_606_HBO_DPM_0089*' 'sb_606_dpm_0089#1' # 0089000-0089999
mmv 'sb_606_HBO_DPM_009*' 'sb_606_dpm_009#1' # 0090000-0099999
mmv 'sb_606_HBO_DPM_01[0-5]*' 'sb_606_dpm_01#1#2' # 0100000-0159999
mmv 'sb_606_HBO_DPM_016[0-2]*' 'sb_606_dpm_016#1#2' # 0160000-0162999
mmv 'sb_606_HBO_DPM_01630[01]?' 'sb_606_dpm_01630#1#2' # 0163000-0163019
mmv 'sb_606_HBO_DPM_016302[0-2]' 'sb_606_dpm_016302#1' # 0163020-0163022
วนรอบตัวเลข
หากคุณต้องการหลีกเลี่ยงการติดตั้งอะไรหรือต้องเลือกตามช่วงตัวเลขหลีกเลี่ยงการจับคู่นอกช่วงนี้และคุณพร้อมที่จะรอการเรียกใช้คำสั่ง 74,023 คุณสามารถใช้ bash loop แบบธรรมดา:
for i in {0089000..0163022}; do mv sb_606_HBO_DPM_$i sb_606_dpm_$i; done
มันใช้งานได้ดีที่นี่เนื่องจากไม่มีช่องว่างในลำดับ มิฉะนั้นคุณอาจต้องการตรวจสอบว่ามีไฟล์ต้นฉบับอยู่จริงหรือไม่
for i in {0089000..0163022}; do
test -e sb_606_HBO_DPM_$i && mv sb_606_HBO_DPM_$i sb_606_dpm_$i
done
โปรดทราบว่าในทางตรงกันข้ามกับfor ((i=89000; i<=163022; ++i))
การขยายรั้งจะจัดการกับศูนย์นำเนื่องจาก Bash บางรุ่นวางจำหน่ายเมื่อสองสามปีก่อน การเปลี่ยนแปลงที่ฉันขอจริง ๆ แล้วฉันจึงดีใจที่เห็นกรณีใช้งาน
อ่านเพิ่มเติม: รั้งการขยายตัว{x..y[..incr]}
ในหน้าข้อมูลทุบตีโดยเฉพาะอย่างยิ่งส่วนที่เกี่ยวกับ
วนรอบไฟล์
ตัวเลือกอื่นจะวนซ้ำวงกลมที่เหมาะสมแทนที่จะวนซ้ำช่วงของจำนวนเต็มในคำถาม บางสิ่งเช่นนี้
for i in *HBO_DPM*; do mv "$i" "${i/HBO_DPM/dpm}"; done
นี่เป็นการmv
เรียกหนึ่งครั้งต่อไฟล์ และอีกครั้งการวนซ้ำอยู่ในรายการองค์ประกอบที่มีความยาว แต่รายการทั้งหมดไม่ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังกระบวนการย่อย แต่จัดการภายในด้วยการทุบตีดังนั้นขีด จำกัด จะไม่ทำให้คุณมีปัญหา
อ่านเพิ่มเติม: การขยายพารามิเตอร์เชลล์ในหน้าข้อมูล Bash จัดทำเอกสาร${parameter/pattern/string}
หมู่คนอื่น ๆ
หากคุณต้องการ จำกัด ช่วงจำนวนให้กับช่วงที่คุณระบุคุณสามารถเพิ่มการตรวจสอบสำหรับสิ่งต่อไปนี้:
for i in sb_606_HBO_DPM_+([0-9]); do
if [[ "${i##*_*(0)}" -ge 89000 ]] && [[ "${i##*_*(0)}" -le 163022 ]]; then
mv "$i" "${i/HBO_DPM/dpm}"
fi
done
นี่${i##pattern}
เอาคำนำหน้าจับคู่ที่ยาวที่สุดจากpattern
$i
คำนำหน้าที่ยาวที่สุดนั้นถูกกำหนดเป็นสิ่งใดก็ตามจากนั้นขีดเส้นใต้จากนั้นจึงเป็นศูนย์หรือมากกว่าศูนย์ หลังถูกเขียนตาม*(0)
ซึ่งเป็นรูปแบบ glob แบบขยายที่ขึ้นอยู่กับextglob
ตัวเลือกที่ถูกตั้งค่า การลบเลขศูนย์นำหน้าถือเป็นสิ่งสำคัญในการรักษาจำนวนให้เป็นฐาน 10 ไม่ใช่ฐาน 8 +([0-9])
อาร์กิวเมนต์ในลูปนั้นเป็นอีกวงกลมหนึ่งที่มีการขยายเพิ่มเติมโดยจับคู่หนึ่งหลักขึ้นไปในกรณีที่คุณมีไฟล์ที่เริ่มต้นเหมือนกัน จำนวน.
ARG_MAX
ขีด จำกัดของเชลล์ เนื่องจากคำถามนี้ขอคำตอบอย่างชัดเจนสำหรับโซลูชันบรรทัดคำสั่ง (อาจเท่ากัน) โซลูชัน GUI ในคำถามอื่น ๆ ก็ไม่ตรงกัน