เปลี่ยนนามสกุลไฟล์ซ้ำ ๆ ใน Bash


87

ฉันต้องการวนซ้ำผ่านไดเร็กทอรีและเปลี่ยนนามสกุลของไฟล์ทั้งหมดของนามสกุล.t1ที่.t2ระบุ คำสั่ง bash สำหรับทำสิ่งนี้คืออะไร?


14
imho นี่ไม่ใช่คำถามซ้ำ - คำถามอื่นไม่ซ้ำ
ผู้ใช้ linux shonky


@AmalAntony: หากคุณไม่มีrenameให้เขียนเชลล์สคริปต์ซึ่งจะเปลี่ยนชื่อไฟล์เดียว (เป็นเรื่องเล็กน้อยที่ต้องทำในกรณีง่ายๆของคุณ) จากนั้นใช้findเพื่อใช้สคริปต์นี้กับไฟล์ทั้งหมดที่มีนามสกุลที่ไม่เหมาะสม
user1934428

คำตอบ:


208

หากคุณมีการเปลี่ยนชื่อให้ใช้:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

หรืออื่น ๆ:

find . -name '*.t1' -exec rename .t1 .t2 {} +

หากไม่สามารถเปลี่ยนชื่อได้ให้ใช้:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush

2
(เวอร์ชันของฉันrenameไม่อนุญาตให้ใช้นิพจน์การแทนที่สไตล์ sed ต้องรัก Linux ฉันเคยต้องติดตั้ง TotalCommander สำหรับ Windows เพื่อทำสิ่งต่างๆเช่นนี้)
Aaron Blenkush

6
ในกรณีที่ใครสงสัยว่า"${1%.t1}".t2ส่วนนั้นทำอะไรเหมือนที่ฉันทำ: มันใช้การจัดการสตริง bash เพื่อทำสิ่งต่อไปนี้: 1 / ใช้พารามิเตอร์ตำแหน่งแรก$1และตัดทอนลิเทอรัล.t1สตริงจากส่วนท้าย ( %ตัวดำเนินการเครื่องหมายเปอร์เซ็นต์) 2 / ผนวก.t2สตริงลิเทอรัลเข้ากับผลลัพธ์
Zack

2
การเปลี่ยนชื่อใช้งานไม่ได้สำหรับฉันใน OSX แต่เวอร์ชัน bash นั้นยอดเยี่ยม b / c ฉันเพิ่งเพิ่ม 'git' ไว้หน้า mv และตอนนี้ git ก็มีความสุข :-D
bdombro

3
ต้องการให้ผู้ใช้find . -type f -name '*.t1'หลีกเลี่ยงโฟลเดอร์
Golak Sarangi

9

หากเวอร์ชันของคุณbashรองรับไฟล์globstarตัวเลือกนี้ (เวอร์ชัน 4 หรือใหม่กว่า):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

7

หรือคุณสามารถติดตั้งmmvคำสั่งและทำ:

mmv '*.t1' '#1.t2'

นี่#1คือส่วนแรกของโลกคือ*ใน*.t1 .

หรือในเรื่องทุบตีล้วนๆวิธีง่ายๆก็คือ:

for f in *.t1; do
    mv "$f" "${f%.t1}.t2"
done

(เช่น: forสามารถแสดงรายการไฟล์โดยไม่ต้องใช้คำสั่งภายนอกเช่นlsหรือfind )

HTH


7
ฉันถือว่าการใช้ OP ของ "เรียกซ้ำ" หมายถึงการเปลี่ยนชื่อไฟล์ในไดเร็กทอรีย่อยของไดเร็กทอรีด้วย
chepner

1
มันเป็นส่วนแรกของโลกคือ*ใน*.t1
zmo

6

ฉันจะทำวิธีนี้ด้วยการทุบตี:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

แก้ไข: ความผิดพลาดของฉัน: มันไม่ได้เกิดซ้ำนี่คือวิธีของฉันในการเปลี่ยนชื่อไฟล์ซ้ำ:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

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