หากฉันมีกลุ่มไฟล์ที่มีนามสกุล. htm ฉันจะเปลี่ยนชื่อพวกเขาทั้งหมดเป็น. html ได้อย่างไร
mv *.htm *.html
ไม่สำเร็จ.
หากฉันมีกลุ่มไฟล์ที่มีนามสกุล. htm ฉันจะเปลี่ยนชื่อพวกเขาทั้งหมดเป็น. html ได้อย่างไร
mv *.htm *.html
ไม่สำเร็จ.
คำตอบ:
หรือคุณสามารถใช้ทุบตีบริสุทธิ์ ... (ยกเว้น mv นั่นคือ .. )
for file in *.htm; do mv "$file" "${file%.htm}.html"; done
และหลีกเลี่ยงสิ่งที่เป็นฐานที่น่ารังเกียจ ;)
Bash มีชุดตัวเลือกการขยายตัวแปรที่หลากหลาย อันที่ใช้ที่นี่ '%' จะลบส่วนต่อท้ายการจับคู่ที่เล็กที่สุดออกจากค่าของตัวแปร รูปแบบนั้นเป็นรูปแบบแบบกลมดังนั้น${file%.*}
จะใช้งานได้เช่นกัน ตัวดำเนินการ '%%' จะลบส่วนต่อท้ายการจับคู่ที่ใหญ่ที่สุดและสามารถใช้แทนกันได้ในตัวอย่างข้างต้นเนื่องจากรูปแบบได้รับการแก้ไขแล้ว${file%%.*}.html
จะเปลี่ยน abhtm เป็น a.html
ดูที่ส่วนย่อยตัวแปรของ manpage ทุบตีสำหรับเทคนิคประณีตมากขึ้น มีหลายสิ่งที่สามารถทำได้ภายในการทุบตีโดยตรง
ไม่ควรมีช่องว่างบรรทัดใหม่หรือช่องว่างอื่นในชื่อไฟล์ แต่คำตอบของ freiheit รุ่นนี้จะจัดการกับสิ่งเหล่านั้น นอกจากนี้ยังใช้$()
แทน backticks เพื่อให้อ่านได้พร้อมกับประโยชน์อื่น ๆ
for file in *.htm
do
mv "$file" "$(basename "$file" .htm).html"
done
ดียิ่งขึ้น - สำหรับกรณีพิเศษที่เพิ่มไปยังจุดสิ้นสุด:
for file in *.htm
do
mv "$file" "${file}l"
done
rename(1)
เป็นสาธารณูปโภค Perl ที่ทำสิ่งที่คุณต้องการ ในกรณีนี้:
rename 's/\.htm$/.html/' *htm
หรือถ้าคุณใช้ไดเรกทอรีย่อยเช่นกัน
(ต้องทุบตี 4.0 และการตั้งค่า GLOBSTAR นี้: shopt -s globstar
)
rename 's/\.htm$/.html/' **/*htm
rename
มาพร้อมกับ Perl และโดยพื้นฐานแล้วยูนิกซ์ทุกตัวจะมาพร้อมกับ Perl ในวันนี้
shopt -s globstar
(โดยค่าเริ่มต้น) นอกจากนี้ Linux และ Unix ยังมีไดเรกทอรีมากกว่าโฟลเดอร์
for file in *.htm; do
mv $file `basename "$file" .htm`.html
done
ลองด้วยการecho
เผชิญหน้าmv
ครั้งแรก
ปัญหาเกี่ยวกับต้นฉบับของคุณคือ " mv *.htm *.html
" มีการ*
จัดการโดยเชลล์ดังนั้นmv
คำสั่งจะเห็นรายการของไฟล์. htm และ. html ทั้งหมดในไดเรกทอรีปัจจุบัน กล่าวอีกนัยหนึ่งเช่น " mv foo.htm bar.htm stuff.htm six.htm file.htm
" mv รู้วิธีจัดการกับข้อโต้แย้งมากกว่า 2 ข้อหากตัวสุดท้ายคือไดเรกทอรี
mv
ไม่ได้
อีกตัวอย่างทุบตีบริสุทธิ์โดยใช้สตริงแทนที่
for file in *.htm; do mv $file ${file/htm/html}; done
พิเศษ - สิ่งนี้จะแทนที่การเกิดขึ้นทั้งหมดของสตริง
for file in *.htm; do mv $file ${file//htm/html}; done
ถ้าคุณใช้Zshคุณสามารถใช้ 'zmv'
mmv \*.htm #1.html
ตัวอย่างการใช้งานอื่น ๆ (และเครื่องมืออื่น ๆ ) ใน " GNU / Linux เครื่องมือบรรทัดคำสั่งสรุป "
#
คุณจำเป็นต้องหลบหนี
ren *.htm *.html
จะทำงานใน Windows