เปลี่ยนชื่อไฟล์ทั้งหมดในโฟลเดอร์ด้วยคำนำหน้าในคำสั่งเดียว


87

เปลี่ยนชื่อไฟล์ทั้งหมดภายในโฟลเดอร์ด้วยคำนำหน้า "Unix_"

สมมติว่าโฟลเดอร์มีสองไฟล์

a.txt
b.pdf

จากนั้นควรเปลี่ยนชื่อทั้งคู่จากคำสั่งเดียวเป็น

Unix_a.txt
Unix_b.pdf

1
check this link => cyberciti.biz/tips/…
red eyes dev

check ที่นี่: theunixshell.blogspot.com/2013/01/…
Vijay

คำตอบ:


108

หากชื่อไฟล์ของคุณไม่มีไวท์สเปซและคุณไม่มีไดเร็กทอรีย่อยใด ๆ คุณสามารถใช้forลูปง่ายๆ:

$ for FILENAME in *; do mv $FILENAME Unix_$FILENAME; done 

มิฉะนั้นให้ใช้renameคำสั่งที่สะดวก(ซึ่งเป็นสคริปต์ perl) - แม้ว่าอาจไม่มีให้ใช้งานนอกกรอบในทุก Unix (เช่น OS X ไม่มีมาด้วยrename)

ภาพรวมสั้น ๆ ที่ debian-administration.org:

หากชื่อไฟล์ของคุณมีช่องว่างการใช้งานจะง่ายกว่าfindบน Linux สิ่งต่อไปนี้ควรใช้งานได้:

$ find . -type f -name '*' -printf "echo mv '%h/%f' '%h/Unix_%f\n'" | sh

ในระบบ BSD ไม่มี-printfตัวเลือก แต่น่าเสียดาย แต่GNU findutilsควรติดตั้งได้ (บน Mac OS X ด้วยbrew install findutils)

$ gfind . -type f -name '*' -printf "mv \"%h/%f\" \"%h/Unix_%f\"\n" | sh

@Matteo: ขอบคุณคำแนะนำ: findการปรับปรุงคำตอบของฉันด้วยคำเตือนบวกสองตัวอย่างด้วย
miku

นอกจากนี้ขอแนะนำfor f in *; do [[ -f ${f} ]] && mv ...; doneให้จับเฉพาะไฟล์ (ไม่มีไดเรกทอรีย่อยลิงก์ ฯลฯ ) ...
twalberg

1
หากคุณอ้างอิงตัวแปรตามที่ควรจะเป็นก็จะfor FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; doneทำงานได้อย่างถูกต้องไม่ว่าจะเป็นอักขระใดในชื่อไฟล์ก็ตาม มันจะย้ายไดเร็กทอรีซ็อกเก็ต symlink และไฟล์ประเภทอื่น ๆ ด้วย ฉันคิดว่ามันไม่สำคัญ
Jonathan Leffler

อย่างไรก็ตามสิ่งนี้เพิ่ม.ก่อนไฟล์ทั้งหมดของฉัน
nullability

77

ลองใช้renameคำสั่งในโฟลเดอร์ด้วยไฟล์ :

rename 's/^/Unix_/' *

อาร์กิวเมนต์ของการเปลี่ยนชื่อ ( คำสั่ง sed s ) แสดงที่จะมาแทนที่ regex ไม่^กับUnix_ เครื่องหมายตก (^) เป็นตัวละครพิเศษที่หมายถึงการเริ่มต้นของบรรทัด


9
คุณช่วยอธิบายความ's/^/.../'หมายได้ไหม?
mcont

@Matteo 's/^/.../'เป็นอาร์กิวเมนต์นิพจน์ perl สำหรับคำสั่งเปลี่ยนชื่อ
RoyalleBlue

นี่มันเจ๋งมาก! ฉันขอแนะนำให้เพิ่มโฟลเดอร์ / * เนื่องจาก * ค่อนข้างอันตรายหากคำสั่งจะถูกทำซ้ำโดยไม่ได้ตั้งใจในที่อื่น
Systems Rebooter

ชงติดตั้งเปลี่ยนชื่อ @OliverPearmain
Felipe Plazas

ตัวอย่างการแทนที่คำนำหน้า:rename 's/^start_/run_' *
DenisKolodin

36

ฉันคิดว่านี่เป็นเพียงสิ่งที่คุณกำลังมองหา:

ls | xargs -I {} mv {} Unix_{}

ใช่มันเรียบง่าย แต่หรูหราและทรงพลังและยังมีซับในด้วย คุณสามารถรับคำแนะนำโดยละเอียดจากฉันได้ที่หน้า: เปลี่ยนชื่อไฟล์และไดเรกทอรี (เพิ่มคำนำหน้า)


2
ระวังการประมวลผลเอาต์พุตของls- อาจทำให้เกิดปัญหาได้หากมีช่องว่างหรืออักขระคี่อื่น ๆ ในชื่อไฟล์
Jonathan Leffler

17

ฉันเพิ่งเผชิญกับสถานการณ์เดียวกันนี้และพบวิธีแก้ปัญหาในตัวที่ง่ายกว่า ฉันกำลังแบ่งปันที่นี่เพื่อที่จะได้ช่วยคนอื่น ๆ ที่กำลังมองหาวิธีแก้ปัญหา

ด้วย OS X Yosemite Apple ได้รวมความสามารถในการเปลี่ยนชื่อแบตช์ไว้ใน Finder โดยตรง ข้อมูลรายละเอียดสามารถใช้ได้ที่นี่ ฉันได้คัดลอกขั้นตอนด้านล่างนี้เช่นกัน

เปลี่ยนชื่อหลายรายการ

  1. เลือกรายการจากนั้นกด Control แล้วคลิกรายการใดรายการหนึ่ง

  2. ในเมนูทางลัดเลือกเปลี่ยนชื่อรายการ

  3. ในเมนูป๊อปอัปด้านล่างเปลี่ยนชื่อรายการโฟลเดอร์ให้เลือกแทนที่ข้อความในชื่อเพิ่มข้อความในชื่อหรือเปลี่ยนรูปแบบชื่อ

    • แทนที่ข้อความ: ป้อนข้อความที่คุณต้องการลบในช่องค้นหาจากนั้นป้อนข้อความที่คุณต้องการเพิ่มในช่อง "แทนที่ด้วย"

    • เพิ่มข้อความ: ป้อนข้อความที่คุณต้องการเพิ่มในช่องจากนั้นเลือกเพิ่มข้อความก่อนหรือหลังชื่อปัจจุบัน

    • รูปแบบ: เลือกรูปแบบชื่อสำหรับไฟล์จากนั้นเลือกใส่ดัชนีตัวนับหรือวันที่ก่อนหรือหลังชื่อ ป้อนชื่อในช่องรูปแบบกำหนดเองจากนั้นป้อนหมายเลขที่คุณต้องการเริ่มต้นด้วย

  4. คลิกเปลี่ยนชื่อ

หากคุณมีรูปแบบทั่วไปในไฟล์ของคุณมากกว่าที่คุณสามารถใช้แทนที่ข้อความได้มิฉะนั้นการเพิ่มข้อความก็จะทำงานได้เช่นกัน


1
ยอดเยี่ยม - ช่วยฉันประหยัดเวลาได้มาก!
user3000868

7

คุณสามารถใช้-iแทน-I {}

ls | xargs -i mv {} unix_{}

นี้ยังทำงานได้อย่างสมบูรณ์

  • ls - แสดงรายการไฟล์ทั้งหมดในไดเร็กทอรี
  • xargs- ยอมรับไฟล์ทั้งหมดทีละบรรทัดเนื่องจาก-iตัวเลือก
  • {}เป็นตัวยึดสำหรับไฟล์ทั้งหมดซึ่งจำเป็นหากxargsได้รับมากกว่าสองอาร์กิวเมนต์เป็นอินพุต

ใช้ awk:

ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh

-iเลิกใช้แล้วตอนนี้เพิ่ง-I
JamPow

มันช่วยฉันใน Debian 8.Thaks
Abror Esonaliev


1

ด้วยrnm (คุณจะต้องติดตั้ง):

rnm -ns 'Unix_/fn/' *

หรือ

rnm -rs '/^/Unix_/' *

PS: ฉันเป็นผู้เขียนเครื่องมือนี้


2
คุณควรอ่านคำตอบทั้งหมดเกี่ยวกับยูทิลิตี้ของคุณและเพิ่มข้อจำกัดความรับผิดชอบที่คุณเป็นผู้เขียน
Mogsdad

@Mogsdad: ฉันไม่คิดว่ามันเป็นข้อมูลที่จำเป็น หากมีใครต้องการหาผู้เขียนก็ทำได้ไม่ยาก
Jahid

ขอบคุณสำหรับเครื่องมือนี้ ด้วยเหตุผลบางอย่างrenameไม่ได้ผลสำหรับฉัน แต่rnmก็ทำ
Aloso

0

สถานการณ์:

เรามีcertificate.key certificate.crtอยู่ข้างใน/user/ssl/

เราต้องการเปลี่ยนชื่ออะไรก็ได้ที่ขึ้นต้นด้วยcertificatetocertificate_OLD

ตอนนี้เราอยู่ด้านใน /user

ขั้นแรกให้ดำเนินการแบบแห้งด้วย-n:

rename -n "s/certificate/certificate_old/" ./ssl/*

ซึ่งผลตอบแทน:

rename(./ssl/certificate.crt, ./ssl/certificate_OLD.crt) rename(./ssl/certificate.key, ./ssl/certificate_OLD.key)

ไฟล์ของคุณจะไม่มีการเปลี่ยนแปลงนี่เป็นเพียงการทดสอบเท่านั้น

วิธีการแก้:

เมื่อคุณมีความสุขกับผลการทดสอบให้ใช้งานจริง:

rename "s/certificate/certificate_OLD/" ./ssl/*

ความหมาย:

เปลี่ยนชื่อ "s / SOMETHING / SOMETING_ELSE" PATH / FILES

เคล็ดลับ:

หากคุณอยู่ในเส้นทางแล้วให้รันดังนี้:

rename "s/certificate/certificate_OLD/" *

หรือถ้าคุณต้องการทำสิ่งนี้ในไดเร็กทอรีย่อยใด ๆ ที่เริ่มต้นด้วยssdo:

rename -n "s/certificat/certificate_old/" ./ss*/*

คุณยังสามารถทำ:

rename -n "s/certi*/certificate_old/" ./ss*/*

ซึ่งเปลี่ยนชื่ออะไรก็ได้ที่ขึ้นต้นด้วยcertiในไดเร็กทอรีย่อยที่ขึ้นต้นด้วยss.

ท้องฟ้าเป็นข้อ จำกัด.

ลองเล่นกับ regex และทดสอบสิ่งนี้ก่อนด้วย-nเสมอ

ระวังสิ่งนี้แม้จะเปลี่ยนชื่อโฟลเดอร์ชื่อที่ตรงกัน ดีกว่าcdลงในไดเร็กทอรีและทำที่นั่น ใช้ในความเสี่ยงของตัวเอง


0

find -execdir rename

การเปลี่ยนชื่อไฟล์และไดเร็กทอรีด้วยนิพจน์ทั่วไปที่มีผลต่อชื่อฐานเท่านั้น

ดังนั้นสำหรับคำนำหน้าคุณสามารถทำได้:

PATH=/usr/bin find . -depth -execdir rename 's/^/Unix_/' '{}' \;

หรือมีผลกับไฟล์เท่านั้น:

PATH=/usr/bin find . -type f -execdir rename 's/^/Unix_/' '{}' \;

-execdir อันดับแรก cdลงในไดเร็กทอรีก่อนที่จะเรียกใช้งานบนชื่อฐานเท่านั้น

ฉันได้อธิบายรายละเอียดเพิ่มเติมที่: ค้นหาไฟล์หลายไฟล์และเปลี่ยนชื่อใน Linux

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