วิธีการเปลี่ยนคำต่อท้ายของไฟล์


3

ในโครงสร้างไดเรกทอรีที่มีหลายโฟลเดอร์ย่อยและไฟล์ในนั้นบางชื่อไฟล์มีคำต่อท้าย_create(เช่นjava1_create) และบางส่วนด้วย_bak( java2_bak)

ฉันต้องการเปลี่ยนชื่อเฉพาะไฟล์ที่มีคำต่อท้าย_createเป็น_bakเพื่อให้ไฟล์ทั้งหมดควรมี_bakคำต่อท้าย

มีคำสั่งหรือสคริปต์ที่จะทำเช่นนี้?

คำตอบ:


2

บน Linux สมมติว่าไม่มีชื่อไฟล์ของคุณ_createอยู่ในนั้น (เฉพาะตอนท้าย) คุณสามารถใช้renameยูทิลิตีจากแพ็กเกจ util-linux ซึ่งติดตั้งบนระบบ Linux ที่ไม่ได้ฝังตัวทั้งหมด การเรียกใช้findเพื่อเรียกใช้งานคำสั่งกับไฟล์ทั้งหมดในไดเรกทอรีย่อยซ้ำ

find -depth -exec rename _create _bak {} +

ใน Debian และการแจกแจงมา (อูบุนตู, มิ้นท์, ... ) ที่จัดส่งสคริปต์ Perl เป็นrenameอย่างใดอย่างหนึ่งเรียกrename.ulแทนrenameหรือเปลี่ยนโดยrename _create _bakrename 's/_create$/_bak/'


แล้วมีrenameจากUnicode::Tusssleซึ่งเป็นอีกหนึ่งสคริปต์ Perl มีตัวเลือกที่แตกต่างกัน (และเนื้อหาที่มีประสิทธิภาพมากขึ้นกว่า) สคริปต์ Perl คุณกำลังหมายถึง อากลิ่นของลินุกซ์ในตอนเช้า ;)
lcd047

1

นี่อาจเป็นสิ่งที่คุณหลังจาก:

for file in $(find . -name "*_create"); do mv -i $file ${file%%_create}_bak; done

อย่าลืมทดสอบก่อนใช้กับไฟล์จริง


การรันคำสั่งจะส่งคืนชื่อตัวแปรที่ผิดกฎหมาย สำหรับไฟล์ใน $ (find. -name "* _create"); ทำ mv -i $ file $ {file %% _ create} _bak; เสร็จแล้วชื่อตัวแปรผิดกฎหมาย
ราวี

@Ravi มันแปลกมันใช้งานได้สำหรับฉัน คุณใช้bashเปลือกหอยหรือที่อื่น
Galik

ขอบคุณ Galic การเปลี่ยนเป็น bash shell และการรันคำสั่งของคุณทำงาน ขอบคุณมากสำหรับความช่วยเหลือ
Ravi

1

บน Debian, Ubuntu และอนุพันธ์ด้วย Perl renameบางครั้งติดตั้งเป็นprename:

#enable ** globbing
shopt -s globstar 
#use the rename utility
rename -n 's/_create$/_bak/' **_create 

ลบการตั้งค่าสถานะ-n(= --no-act) หากทำงานตามที่คาดไว้


บันทึก:

นี้น่าจะเป็นวิธีที่มีประสิทธิภาพที่สั้นที่สุดจะทำเช่นนี้โดยเฉพาะอย่างยิ่งถ้าคุณได้มีshotp -s globstarอยู่แล้วใน (ฉันมีมันอยู่ในของฉัน~/.bashrc)

อย่างไรก็ตามคุณจะได้รับ:

-bash: /usr/bin/rename: Argument list too long

ถ้าการ**_createขยายตัวมีความgetconf ARG_MAXยาวเกินอักขระ (2097152 บนกล่อง Linux ของฉัน)

หากเป็นกรณีนี้คุณจะต้องใช้find -print0กับxargs -0(ดูคำตอบของ lcd047 )


นอกจากนี้คุณไม่ควรเพิ่ม-nในตอนท้ายของบรรทัดคำสั่ง สายเกินไปสำหรับสิ่งนั้นใช่ไหม
lcd047

มันไม่สำคัญว่าที่-nคือตราบใดที่มันเป็นก่อน--ถ้า--เป็นหนึ่งในข้อโต้แย้ง มันจบแล้วเพราะนั่นคือสิ่งที่ง่ายที่สุดที่จะลบออก
PSkocik

ฉันลองแล้วใช้งานได้ (ไม่ได้ทำอะไร) เห็นได้ชัดว่าเรามีความแตกต่างrenameแล้ว ของฉันจากutil-linux 2.20.1-5.1ubuntu20.4แพคเกจ ไม่มี-0ตัวเลือกและตัวเลือก CL ไม่จำเป็นต้องมาก่อนอาร์กิวเมนต์
PSkocik

ฉันย้าย-nก่อนหน้า args เพื่อให้พกพามากขึ้น xargs -0แทนที่จะrename -0ทำให้พกพาสะดวกมากขึ้นด้วย
PSkocik

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