วิธีที่ดีในการเพิ่มนามสกุลไฟล์ ".jpg" ลงในไฟล์ที่ไม่มีนามสกุลด้วย bash คืออะไร?
วิธีที่ดีในการเพิ่มนามสกุลไฟล์ ".jpg" ลงในไฟล์ที่ไม่มีนามสกุลด้วย bash คืออะไร?
คำตอบ:
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done
"${f%.jpg}"
คือการจัดการสตริง bash shell `$ {string% substring}` ลบการจับคู่ที่สั้นที่สุดของ $ substring จากด้านหลัง $ string
.jpg
เข้าไปในไฟล์ปกติได้
คุณสามารถใช้การเปลี่ยนชื่อ:
rename 's/(.*)/$1.jpg/' *
rename from to file...
อีกวิธีหนึ่ง - ไม่มีลูป
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg
ทำให้พังถล่ม:
คำสั่งด้านบนนี้ใช้สำหรับdry runหลังจากนั้นคุณควรลบ "echo" ก่อน mv
แก้ไข บางคนบอกว่านี่เป็นสิ่งจำเป็น"ข้อโต้แย้งเส้นทางตัดในเครื่องหมายคำพูด; หลีกเลี่ยงแยกโต้แย้งในเส้นทางที่มีช่องว่าง"
โดยปกติคำแนะนำนี้จะเป็นจริงในกรณีนี้ไม่ใช่ เนื่องจากที่นี่สิ่ง%
นี้ไม่ได้ถูกแทนที่ด้วยการขยายเชลล์ แต่โดยxargs
ภายใน (โดยตรง) ดังนั้น%
จะถูกแทนที่อย่างถูกต้องแม้จะมีช่องว่างในชื่อไฟล์ก็ตาม
การสาธิตง่ายๆ:
$ mkdir xargstest
$ cd xargstest
# create two files with spaces in names
$ touch 'a b' 'c d'
$ find . -type f -print
./c d
./a b
# notice, here are spaces in the above paths
#the actual xargs mv WITHOUT quotes
$ find . -type f -print | xargs -I % mv % %.ext
$ find . -type f -print
./a b.ext
./c d.ext
# the result is correct even in case with spaces in the filenames...
ง่าย cd ไปยังไดเร็กทอรีที่ไฟล์ของคุณอยู่และ:
for f in *;do mv $f $f.jpg;done
for f in *;do mv "$f" "$f".jpg;done
เพื่อรองรับช่องว่างในชื่อไฟล์
วิ่งแห้ง:
rename -n s/$/.jpg/ *
การเปลี่ยนชื่อจริง:
rename s/$/.jpg/ *
find . | while read FILE; do if [ $(file --mime-type -b "$FILE") == "image/jpeg" ]; then mv "$FILE" "$FILE".jpg; fi; done;
ในกรณีของฉันฉันไม่ทราบประเภทไฟล์ดังนั้นฉันจึงใช้คำสั่งmvด้วยความช่วยเหลือของคำสั่งfileเพื่อตรวจสอบและอาจพบประเภทไฟล์ โซลูชันนี้อาจไม่สมบูรณ์แบบสำหรับไฟล์ทั้งหมดเนื่องจากคำสั่งfileอาจไม่รู้จักประเภทไฟล์ แต่ส่วนใหญ่ทำงานได้ดีสำหรับฉัน
for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done
การใช้ awk คือการตัดคำที่สองของสตริงที่ส่งคืนจากไฟล์คำสั่งที่เป็นนามสกุลจริง
rename --dry-run * -a ".jpg" # test
* -a ".jpg" # rename
--dry-run
และไม่สามารถใช้ได้ในรุ่นของฉัน-a
rename
หากเป็นสิ่งที่เฉพาะเจาะจงสำหรับสถาปัตยกรรมบางอย่างควรระบุ
ไรอันลี่
ไวยากรณ์ที่ถูกต้องสำหรับการเพิ่มนามสกุลไฟล์ให้กับไฟล์หลาย ๆ ไฟล์ภายในไดเร็กทอรีที่ไม่มีนามสกุลไฟล์คือ
find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then mv "$FILE" "$FILE".eml; fi; done;
mv "${file}" "${file}.jpg"
เหรอ?