ฉันจะแทนที่คำนำหน้าสำหรับไฟล์จำนวนมากได้อย่างไร
ฉันมีไฟล์จำนวนมากเช่น
- TestSRConnectionContext.h
- TestSRConnectionContext.m
ฉันต้องการเปลี่ยนพวกเขาทั้งหมดเป็น
- CLConnectionContext.h
- CLConnectionContext.m
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันจะแทนที่คำนำหน้าสำหรับไฟล์จำนวนมากได้อย่างไร
ฉันมีไฟล์จำนวนมากเช่น
ฉันต้องการเปลี่ยนพวกเขาทั้งหมดเป็น
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
for name in TestSR*
do
newname=CL"$(echo "$name" | cut -c7-)"
mv "$name" "$newname"
done
นี้ใช้แทนคำสั่งทุบตีเพื่อเอา 6 ตัวอักษรแรกจากการป้อนข้อมูลผ่านทางชื่อไฟล์cut
, prepends เพื่อผลและร้านค้าที่อยู่ในCL
$newname
จากนั้นจะเปลี่ยนชื่อเก่าเป็นชื่อใหม่ ดำเนินการกับไฟล์ทุกไฟล์
cut -c7-
ระบุว่าเฉพาะอักขระหลังจากดัชนี 7 ควรถูกส่งคืนจากอินพุต 7-
เป็นช่วงที่เริ่มต้นที่ดัชนี 7 โดยไม่มีจุดสิ้นสุด นั่นคือจนกว่าจะสิ้นสุดของบรรทัด
ก่อนหน้านี้ฉันเคยใช้cut -b7-
แต่-c
ควรใช้แทนการจัดการการเข้ารหัสอักขระที่อาจมีหลายไบต์ต่ออักขระเช่น UTF-8
ฉันจะบอกว่าง่ายที่สุดที่จะเพียงแค่ใช้rename
คำสั่งซึ่งเป็นเรื่องธรรมดาในการกระจาย Linux จำนวนมาก มีคำสั่งนี้อยู่สองเวอร์ชันทั่วไปดังนั้นให้ตรวจสอบ man page เพื่อค้นหาว่าคุณมีรุ่นใด:
## rename from Perl (common in Debian systems -- Ubuntu, Mint, ...)
rename 's/^TestSR/CL/' *
## rename from util-linux-ng (common in Fedora systems, Red Hat, CentOS, ...)
rename TestSR CL *
หากคุณต้องการใช้เวอร์ชันจาก util-linux-ng ในระบบ Debian มันมีอยู่ในชื่อ rename.ul
rename
มีอยู่หลายรุ่นในป่า ตรวจสอบrename
เอกสารในพื้นที่ของคุณเพื่อหาวิธีใช้ของคุณ
rename TestSR '' *
rename "\<pre\>" "" *
->Unterminated <> operator at (user-supplied code).
การขยายพารามิเตอร์ของเชลล์เพียงพอสำหรับการแปลงแบบง่ายเช่นนี้ การทดแทนคำสั่งมีประสิทธิภาพน้อยลงเนื่องจากความต้องการที่จะวางไข่กระบวนการพิเศษ (สำหรับการทดแทนคำสั่งตัวเองและcut
/ sed
)
for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done
TestSR*
ค้นหาไฟล์CL${f#TestSR}
จะเป็นชื่อใหม่ เนื้อหาหลังจาก#
จะถูกแทนที่จากชื่อไฟล์ ( f
)
นี่คือวิธีหนึ่ง:
ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
ls *.{h,m}
-> ค้นหาไฟล์ทั้งหมดที่มีนามสกุล. h หรือ. mn=CL
-> เพิ่มคำนำหน้า CL ให้กับชื่อไฟล์sed -e 's/^Test//'
-> ลบคำนำหน้าการทดสอบออกจากชื่อไฟล์mv $a $n
-> ทำการเปลี่ยนชื่อคุณสามารถลองด้วย:
for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done
ดูman bash
(ส่วน "การขยายพารามิเตอร์") สำหรับรายละเอียด
ก็ไม่ยากอย่างที่คิด
$ for f in TestSR*.m; do mv $f CL$(echo $f | cut -c7-); done;
$ for f in TestSR*.h; do mv $f CL$(echo $f | cut -c7-); done;
for f in TestSR*.[mh]
, ,for f in TestSR*.{m,h}
for f in TestSR*.m TestSR*.h
หากคุณต้องการอะไรที่เพรียวมากกว่าคุณสามารถทำได้
perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *