วิธีการเปลี่ยนชื่อไฟล์หลายไฟล์โดยการลบส่วนขยาย?


14

ฉันมีไฟล์ TIFF จำนวนหนึ่งชื่อ:

sw.001.tif
sw.002.tif
...

และฉันต้องการลบ.tifที่ส่วนท้ายของแต่ละไฟล์ ฉันจะใช้renameคำสั่งเพื่อทำสิ่งนี้ได้อย่างไร


2
โปรดจำไว้ว่าระบบไฟล์ NO linux หรือ unix ใช้ Windows หรือ VMS ในรูปแบบ "ส่วนขยาย" - เป็นเพียงตามแบบแผนที่ต่อท้ายชื่อไฟล์คือ ".tif" หรือ ".c" หรือ ".o" หรือ ".so" "หรืออะไรก็ตาม
Bruce Ediger

ไม่เป็นไร ... ฉันกำลังนำเข้าไฟล์จาก windows ไปยัง linux :)
Paul

1
ในทางเทคนิคแล้วการพูด Windows ไม่ได้ใช้นามสกุลไฟล์อย่างใดอย่างหนึ่งมันเป็นเพียงตัวจัดการไฟล์ของ Windows 95 ที่ใช้อักขระตัวสุดท้ายของชื่อไฟล์เพื่อกำหนดประเภทของไฟล์หลังจากที่แตกออกจากรูปแบบการตั้งชื่อ MS-DOS และการประชุมยังคงอยู่
RAKK

คำตอบ:


24

perlของrename(ตามปกติพบบน Debian ที่เรียกว่าprename) หรืออนุพันธ์นี้ ( renameแพ็คเกจบน Debian):

rename 's/\.tif$//' *.tif

util-linux rename(ตามปกติจะพบได้ที่ Red Hat rename.ulบน Debian):

rename -- .tif '' *.tif

(โปรดทราบว่าจะเปลี่ยนชื่อblah.tiffany.tifเป็นblahfany.tif)


2
ฉันเชื่อว่าการเปลี่ยนชื่อ "Debian" โดย Larry Wall (มาพร้อมกับ Perl?) และ "Red Hat" อันหนึ่งมาจาก util-linux (rename.ul ใน Debian IIRC)
XTL

@XTL: จริง ฉันเรียกพวกเขาว่าเพราะพวกเขาเป็นโปรแกรม "เปลี่ยนชื่อ" ที่พบในตราสารอนุพันธ์ Debian หรือ Red Hat
Ignacio Vazquez-Abrams

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

คำสั่งที่สองส่งผลให้ไวยากรณ์ไม่ถูกต้อง แต่คำสั่งแรกทำงาน
HelloWorld

6

สำหรับการไม่เปลี่ยนชื่อคุณอาจทำ:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i เพื่อเตือนไม่ให้เปลี่ยนไฟล์)


15
รุ่นที่เร็วกว่าปลอดภัยกว่า:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013

+1 ในความคิดเห็นล่าสุดที่นี่ ปลอดภัยกว่าสำหรับชื่อไฟล์ที่มีช่องว่าง
petobens

1
@ jw013 ความคิดเห็นของคุณควรเป็นคำตอบระดับสูงสุด
Roland

1
rename -- .oldext .newext *.oldext

สิ่งนี้จะแทนที่ส่วนขยายเก่าด้วยส่วนใหม่ ในการลบส่วนขยายออกคุณสามารถส่งผ่านสตริงว่างเปล่าเป็นอาร์กิวเมนต์ได้อย่างชัดเจน

rename -- .gz.tmp  '' *.gz.tmp

ด้วยคำสั่งข้างต้นไฟล์ทั้งหมดที่มีส่วนขยายในโฟลเดอร์ปัจจุบันจะเปลี่ยนชื่อเป็น.gz.tmpfilename.gz

อ้างถึงบทความ: Linux: ลบนามสกุลไฟล์สำหรับหลายไฟล์เพื่อดูรายละเอียด


1
ที่ถือว่าการดำเนินการ util-ลินุกซ์renameที่ไม่เข้ากันกับ (และมาก จำกัด มากกว่า) แบบคำสั่งจากrename perl
Stéphane Chazelas

โปรดทราบว่ามันจะแทนที่การเกิดขึ้นครั้งแรกของ.oldextชื่อไฟล์โดยไม่จำเป็นต้องมีนามสกุล ( foo.oldextasy.oldextจะถูกเปลี่ยนชื่อเป็นfootasy.oldext)
Stéphane Chazelas

1

หากคุณใช้ IBM AIX คุณจะไม่มีrenameคำสั่งดังนั้นเพื่อที่จะลบแบตช์นามสกุลไฟล์คุณจะต้องใช้คำสั่ง vanilla System V UNIX ธรรมดา:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.