เปลี่ยนชื่อเป็นกลุ่มเปลี่ยนคำนำหน้า


53

ฉันจะแทนที่คำนำหน้าสำหรับไฟล์จำนวนมากได้อย่างไร

ฉันมีไฟล์จำนวนมากเช่น

  • TestSRConnectionContext.h
  • TestSRConnectionContext.m

ฉันต้องการเปลี่ยนพวกเขาทั้งหมดเป็น

  • CLConnectionContext.h
  • CLConnectionContext.m

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


38
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


ขอบคุณฉันได้รับตอนนี้ด้วยตัวเองเช่นกัน ทำเครื่องหมายว่าเป็นคำตอบ ขอบคุณ
ErikTJ

มันใช้งานได้ดีขอบคุณ คุณช่วยอธิบายว่า -b7- ทำอะไรได้บ้าง? นี่คือการอ้างอิงไปยังรายการไบต์? ss64.com/bash/cut.html
เพิ่ม

@imjared อัปเดตคำตอบพร้อมรายละเอียดเพิ่มเติม
mrb

56

ฉันจะบอกว่าง่ายที่สุดที่จะเพียงแค่ใช้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


7
A caveat: renameมีอยู่หลายรุ่นในป่า ตรวจสอบrenameเอกสารในพื้นที่ของคุณเพื่อหาวิธีใช้ของคุณ
jw013

ในการลบนามแฝงออกrename TestSR '' *
Bsienn

อืม ... rename "\<pre\>" "" *->Unterminated <> operator at (user-supplied code).
Flash Thunder

32

การขยายพารามิเตอร์ของเชลล์เพียงพอสำหรับการแปลงแบบง่ายเช่นนี้ การทดแทนคำสั่งมีประสิทธิภาพน้อยลงเนื่องจากความต้องการที่จะวางไข่กระบวนการพิเศษ (สำหรับการทดแทนคำสั่งตัวเองและcut/ sed)

for f in TestSR*; do mv "$f" "CL${f#TestSR}"; done

คำอธิบาย: TestSR*ค้นหาไฟล์CL${f#TestSR}จะเป็นชื่อใหม่ เนื้อหาหลังจาก#จะถูกแทนที่จากชื่อไฟล์ ( f)
Joe Eifert

4

นี่คือวิธีหนึ่ง:

ls *.{h,m} | while read a; do n=CL$(echo $a | sed -e 's/^Test//'); mv $a $n; done
  • ls *.{h,m} -> ค้นหาไฟล์ทั้งหมดที่มีนามสกุล. h หรือ. m
  • n=CL -> เพิ่มคำนำหน้า CL ให้กับชื่อไฟล์
  • sed -e 's/^Test//' -> ลบคำนำหน้าการทดสอบออกจากชื่อไฟล์
  • mv $a $n -> ทำการเปลี่ยนชื่อ

3

คุณสามารถลองด้วย:

for i in TestSR*; do mv ${i} ${i/#TestSR/CL}; done

ดูman bash(ส่วน "การขยายพารามิเตอร์") สำหรับรายละเอียด


1

ก็ไม่ยากอย่างที่คิด

$ 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;

1
ในกรณีที่ช่วยได้ในอนาคตคุณไม่จำเป็นต้องทำซ้ำคำสั่งสำหรับสองรูปแบบของคุณ คุณสามารถใช้ (ตัวอย่าง): for f in TestSR*.[mh], ,for f in TestSR*.{m,h} for f in TestSR*.m TestSR*.h
mrb

1

หากคุณต้องการอะไรที่เพรียวมากกว่าคุณสามารถทำได้

perl -e 'for(@ARGV) { rename($_, $n) if( ($n = $_ ) =~ s/^TestSR/CL/) }' *
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.