ฉันมีไดเร็กทอรีและไดเร็กทอรีย่อยสองสามรายการที่มีไฟล์ที่ไม่มีนามสกุลไฟล์ ฉันต้องการเพิ่มลง.jpg
ในไฟล์ทั้งหมดที่อยู่ในไดเร็กทอรีเหล่านี้ ฉันเคยเห็นสคริปต์ทุบตีสำหรับการเปลี่ยนนามสกุลไฟล์ แต่ไม่ใช่แค่การเพิ่ม ยังต้องเรียกซ้ำใครช่วยได้ไหม
ฉันมีไดเร็กทอรีและไดเร็กทอรีย่อยสองสามรายการที่มีไฟล์ที่ไม่มีนามสกุลไฟล์ ฉันต้องการเพิ่มลง.jpg
ในไฟล์ทั้งหมดที่อยู่ในไดเร็กทอรีเหล่านี้ ฉันเคยเห็นสคริปต์ทุบตีสำหรับการเปลี่ยนนามสกุลไฟล์ แต่ไม่ใช่แค่การเพิ่ม ยังต้องเรียกซ้ำใครช่วยได้ไหม
คำตอบ:
คำสั่งทางเลือกที่ไม่มีการวนซ้ำอย่างชัดเจน ( man find
):
find . -type f -exec mv '{}' '{}'.jpg \;
คำอธิบาย: สิ่งนี้จะค้นหาไฟล์ทั้งหมดแบบวนซ้ำ ( -type f
) โดยเริ่มจากไดเร็กทอรีปัจจุบัน ( .
) และใช้คำสั่ง move ( mv
) กับแต่ละไฟล์ โปรดสังเกตคำพูดรอบ ๆ{}
เพื่อให้ชื่อไฟล์ที่มีช่องว่าง (และแม้แต่ขึ้นบรรทัดใหม่ ... ) ได้รับการจัดการอย่างเหมาะสม
for
วนซ้ำที่ทำให้ทุบตีเพื่อทำซ้ำในรายการไฟล์นั่นไม่ถูกต้อง bash for
loop จะออกmv
คำสั่งแต่ละคำสั่งซ้ำ ๆ
find
แรกตั้งค่ารายการไฟล์ก่อนที่จะดำเนินการ-exec
คำสั่งหรือไม่? ฉันเดาอย่างนั้น แต่ต้องการให้ประเด็นนี้ชัดเจนก่อนที่จะเข้ารหัสลูปที่ไม่มีที่สิ้นสุด
-not -name "*.*"
จะทำเคล็ดลับ
จะพบไฟล์ที่ไม่มีนามสกุลและเพิ่ม. jpg ของคุณ
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
นี่ช้าไปหน่อย แต่ฉันคิดว่าฉันจะเพิ่มวิธีแก้ปัญหาที่ดีกว่า (แม้ว่าอาจจะอ่านได้น้อยกว่า) ที่อาจจะเป็น:
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
ใช้ find | xargs
ทั่วไปรูปแบบจะส่งผลให้การดำเนินการมีประสิทธิภาพมากขึ้นเนื่องจากคุณไม่ต้องแยกกระบวนการใหม่สำหรับแต่ละไฟล์
โปรดทราบว่าสิ่งนี้ต้องใช้การเปลี่ยนชื่อเวอร์ชันที่พบใน Distros ที่ปรุงแต่งด้วย Debian (aka prename) มากกว่าการเปลี่ยนชื่อแบบเดิม แม้ว่ามันจะเป็นสคริปต์ perl เล็ก ๆ ดังนั้นมันจะง่ายพอที่จะใช้คำสั่งด้านบนกับระบบใดก็ได้
แบบนี้,
for f in $(find . -type f); do mv $f ${f}.jpg; done
ฉันไม่คาดหวังว่าคุณจะมีชื่อไฟล์ที่คั่นด้วยช่องว่าง
หากคุณมีชื่อจะต้องได้รับการประมวลผลเล็กน้อย
หากคุณต้องการเรียกใช้คำสั่งจากไดเร็กทอรีอื่น
คุณสามารถแทนที่find .
ด้วยfind /target/directory
.
-type
ด้วย
สำหรับการเปลี่ยนชื่อไฟล์ทั้งหมดที่ไม่มีนามสกุลใน Windows พื้นฐานคุณสามารถทำได้ren * *.jpg
เนื่องจากไฟล์ไม่มีนามสกุลให้ใช้ * หรือถ้าคุณต้องการเปลี่ยน png เป็น jpg ให้ใช้ren *.png *.jpg
rename
ไม่แน่ใจว่าสามารถเปลี่ยนชื่อไฟล์ที่ไม่มีนามสกุลได้ (ตอนนี้ฉันใช้ windows 7)
rename
หนึ่งโปรแกรม C รวมอยู่ใน util-linux-ng และหนึ่งโปรแกรม Perl (โดย Wall เอง) บนเครื่อง Debian ของมหาวิทยาลัยของเรา อันที่จริงไม่มีการเรียกซ้ำทั้งคู่