เปลี่ยนชื่อไฟล์ทั้งหมดภายในโฟลเดอร์ด้วยคำนำหน้า "Unix_"
สมมติว่าโฟลเดอร์มีสองไฟล์
a.txt
b.pdf
จากนั้นควรเปลี่ยนชื่อทั้งคู่จากคำสั่งเดียวเป็น
Unix_a.txt
Unix_b.pdf
เปลี่ยนชื่อไฟล์ทั้งหมดภายในโฟลเดอร์ด้วยคำนำหน้า "Unix_"
สมมติว่าโฟลเดอร์มีสองไฟล์
a.txt
b.pdf
จากนั้นควรเปลี่ยนชื่อทั้งคู่จากคำสั่งเดียวเป็น
Unix_a.txt
Unix_b.pdf
คำตอบ:
หากชื่อไฟล์ของคุณไม่มีไวท์สเปซและคุณไม่มีไดเร็กทอรีย่อยใด ๆ คุณสามารถใช้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
find
การปรับปรุงคำตอบของฉันด้วยคำเตือนบวกสองตัวอย่างด้วย
for f in *; do [[ -f ${f} ]] && mv ...; done
ให้จับเฉพาะไฟล์ (ไม่มีไดเรกทอรีย่อยลิงก์ ฯลฯ ) ...
for FILENAME in *; do mv "$FILENAME" "Unix_$FILENAME"; done
ทำงานได้อย่างถูกต้องไม่ว่าจะเป็นอักขระใดในชื่อไฟล์ก็ตาม มันจะย้ายไดเร็กทอรีซ็อกเก็ต symlink และไฟล์ประเภทอื่น ๆ ด้วย ฉันคิดว่ามันไม่สำคัญ
.
ก่อนไฟล์ทั้งหมดของฉัน
ลองใช้rename
คำสั่งในโฟลเดอร์ด้วยไฟล์ :
rename 's/^/Unix_/' *
อาร์กิวเมนต์ของการเปลี่ยนชื่อ ( คำสั่ง sed s ) แสดงที่จะมาแทนที่ regex ไม่^กับUnix_ เครื่องหมายตก (^) เป็นตัวละครพิเศษที่หมายถึงการเริ่มต้นของบรรทัด
's/^/.../'
หมายได้ไหม?
's/^/.../'
เป็นอาร์กิวเมนต์นิพจน์ perl สำหรับคำสั่งเปลี่ยนชื่อ
rename 's/^start_/run_' *
ฉันคิดว่านี่เป็นเพียงสิ่งที่คุณกำลังมองหา:
ls | xargs -I {} mv {} Unix_{}
ใช่มันเรียบง่าย แต่หรูหราและทรงพลังและยังมีซับในด้วย คุณสามารถรับคำแนะนำโดยละเอียดจากฉันได้ที่หน้า: เปลี่ยนชื่อไฟล์และไดเรกทอรี (เพิ่มคำนำหน้า)
ls
- อาจทำให้เกิดปัญหาได้หากมีช่องว่างหรืออักขระคี่อื่น ๆ ในชื่อไฟล์
ฉันเพิ่งเผชิญกับสถานการณ์เดียวกันนี้และพบวิธีแก้ปัญหาในตัวที่ง่ายกว่า ฉันกำลังแบ่งปันที่นี่เพื่อที่จะได้ช่วยคนอื่น ๆ ที่กำลังมองหาวิธีแก้ปัญหา
ด้วย OS X Yosemite Apple ได้รวมความสามารถในการเปลี่ยนชื่อแบตช์ไว้ใน Finder โดยตรง ข้อมูลรายละเอียดสามารถใช้ได้ที่นี่ ฉันได้คัดลอกขั้นตอนด้านล่างนี้เช่นกัน
เปลี่ยนชื่อหลายรายการ
เลือกรายการจากนั้นกด Control แล้วคลิกรายการใดรายการหนึ่ง
ในเมนูทางลัดเลือกเปลี่ยนชื่อรายการ
ในเมนูป๊อปอัปด้านล่างเปลี่ยนชื่อรายการโฟลเดอร์ให้เลือกแทนที่ข้อความในชื่อเพิ่มข้อความในชื่อหรือเปลี่ยนรูปแบบชื่อ
แทนที่ข้อความ: ป้อนข้อความที่คุณต้องการลบในช่องค้นหาจากนั้นป้อนข้อความที่คุณต้องการเพิ่มในช่อง "แทนที่ด้วย"
เพิ่มข้อความ: ป้อนข้อความที่คุณต้องการเพิ่มในช่องจากนั้นเลือกเพิ่มข้อความก่อนหรือหลังชื่อปัจจุบัน
รูปแบบ: เลือกรูปแบบชื่อสำหรับไฟล์จากนั้นเลือกใส่ดัชนีตัวนับหรือวันที่ก่อนหรือหลังชื่อ ป้อนชื่อในช่องรูปแบบกำหนดเองจากนั้นป้อนหมายเลขที่คุณต้องการเริ่มต้นด้วย
คลิกเปลี่ยนชื่อ
หากคุณมีรูปแบบทั่วไปในไฟล์ของคุณมากกว่าที่คุณสามารถใช้แทนที่ข้อความได้มิฉะนั้นการเพิ่มข้อความก็จะทำงานได้เช่นกัน
คุณสามารถใช้-i
แทน-I {}
ls | xargs -i mv {} unix_{}
นี้ยังทำงานได้อย่างสมบูรณ์
ls
- แสดงรายการไฟล์ทั้งหมดในไดเร็กทอรีxargs
- ยอมรับไฟล์ทั้งหมดทีละบรรทัดเนื่องจาก-i
ตัวเลือก{}
เป็นตัวยึดสำหรับไฟล์ทั้งหมดซึ่งจำเป็นหากxargs
ได้รับมากกว่าสองอาร์กิวเมนต์เป็นอินพุตใช้ awk:
ls -lrt | grep '^-' | awk '{print "mv "$9" unix_"$9""}' | sh
-i
เลิกใช้แล้วตอนนี้เพิ่ง-I
ยังใช้ได้กับรายการที่มีช่องว่างและละเว้นไดเรกทอรี
for f in *; do [[ -f "$f" ]] && mv "$f" "unix_$f"; done
ด้วยrnm (คุณจะต้องติดตั้ง):
rnm -ns 'Unix_/fn/' *
หรือ
rnm -rs '/^/Unix_/' *
PS: ฉันเป็นผู้เขียนเครื่องมือนี้
rename
ไม่ได้ผลสำหรับฉัน แต่rnm
ก็ทำ
สถานการณ์:
เรามีcertificate.key
certificate.crt
อยู่ข้างใน/user/ssl/
เราต้องการเปลี่ยนชื่ออะไรก็ได้ที่ขึ้นต้นด้วยcertificate
tocertificate_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/" *
หรือถ้าคุณต้องการทำสิ่งนี้ในไดเร็กทอรีย่อยใด ๆ ที่เริ่มต้นด้วยss
do:
rename -n "s/certificat/certificate_old/" ./ss*/*
คุณยังสามารถทำ:
rename -n "s/certi*/certificate_old/" ./ss*/*
ซึ่งเปลี่ยนชื่ออะไรก็ได้ที่ขึ้นต้นด้วยcerti
ในไดเร็กทอรีย่อยที่ขึ้นต้นด้วยss
.
ท้องฟ้าเป็นข้อ จำกัด.
ลองเล่นกับ regex และทดสอบสิ่งนี้ก่อนด้วย-n
เสมอ
ระวังสิ่งนี้แม้จะเปลี่ยนชื่อโฟลเดอร์ชื่อที่ตรงกัน ดีกว่าcd
ลงในไดเร็กทอรีและทำที่นั่น ใช้ในความเสี่ยงของตัวเอง
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