ฉันต้องเปลี่ยนชื่อหลายไฟล์ในไดเรกทอรีโดยลบ 5 ตัวอักษรแรกสำหรับแต่ละชื่อไฟล์
ฉันจะทำสิ่งนี้ฉันทุบตี / เปลือก? ฉันใช้ Ubuntu 11.10 ขอบคุณ
ฉันต้องเปลี่ยนชื่อหลายไฟล์ในไดเรกทอรีโดยลบ 5 ตัวอักษรแรกสำหรับแต่ละชื่อไฟล์
ฉันจะทำสิ่งนี้ฉันทุบตี / เปลือก? ฉันใช้ Ubuntu 11.10 ขอบคุณ
คำตอบ:
ง่ายสำหรับวนรอบกับบิต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
กล่าวว่าเพื่อให้ตรงกับตัวอักษรใด ๆ ห้า ( .
หมายถึงตัวอักษรใด ๆ ) ที่เริ่มต้นของสตริง (คน^
) และลบออก
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 ตัวอักษร
คุณสามารถใช้ sed เพื่อทำสิ่งนี้
for file in * ; do mv $file $(echo $file |sed 's/^.\{5\}//g'); done
ทุกคำตอบที่ดีขอบคุณ นี่คือสิ่งที่ทำงานในกรณีของฉัน:
rename 's/^.......//g' *
สองเซ็นต์ของฉัน:
for file in *; do mv $file ${file:5}; done
${file:n}
เอาคนแรกที่ตัวละครในสตริงn
file