ฉันจะเปลี่ยนชื่อไฟล์หลายไฟล์โดยการลบอักขระใน bash ได้อย่างไร


10

ฉันต้องเปลี่ยนชื่อหลายไฟล์ในไดเรกทอรีโดยลบ 5 ตัวอักษรแรกสำหรับแต่ละชื่อไฟล์
ฉันจะทำสิ่งนี้ฉันทุบตี / เปลือก? ฉันใช้ Ubuntu 11.10 ขอบคุณ

คำตอบ:


11

ง่ายสำหรับวนรอบกับบิตsedจะทำเคล็ดลับ:

% touch xxxxx{foo,bar,baz}
% ls -l xxxxx{foo,bar,baz}
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxbaz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 xxxxxfoo  
% for file in xxxxx*; do mv $file $(echo $file | sed -e 's/^.....//'); done
% ls -l foo bar baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 bar
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 baz
-rw-r--r--  1 jamesog  wheel  0 29 Dec 18:07 foo

แทนregexในsedกล่าวว่าเพื่อให้ตรงกับตัวอักษรใด ๆ ห้า ( .หมายถึงตัวอักษรใด ๆ ) ที่เริ่มต้นของสตริง (คน^) และลบออก


9

Bash มีความเป็นไปได้ในการเขียนสคริปต์ที่น่าทึ่ง นี่คือวิธีหนึ่ง:

for file in ??????*; do mv $file `echo $file | cut -c6-`; done

วิธีที่สะดวกในการทดสอบสิ่งที่ต้องทำคือการเพิ่มเสียงสะท้อนต่อหน้าคำสั่ง:

for file in ??????*; do echo mv $file `echo $file | cut -c6-`; done

เครื่องหมายคำถามหกตัวรับรองว่าคุณพยายามทำสิ่งนี้กับชื่อไฟล์ที่ยาวเกิน 5 ตัวอักษร



5

ทุกคำตอบที่ดีขอบคุณ นี่คือสิ่งที่ทำงานในกรณีของฉัน:

rename 's/^.......//g' *

1

สองเซ็นต์ของฉัน:

for file in *; do mv $file ${file:5}; done

${file:n}เอาคนแรกที่ตัวละครในสตริงnfile


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