เพิ่มนามสกุลไฟล์ลงในไฟล์ด้วย bash


94

วิธีที่ดีในการเพิ่มนามสกุลไฟล์ ".jpg" ลงในไฟล์ที่ไม่มีนามสกุลด้วย bash คืออะไร?


3
mv "${file}" "${file}.jpg"เหรอ?
onteria_

2
ในมุมมองของคุณ "ไฟล์ที่ไม่มีนามสกุล" คืออะไร? เป็นไฟล์ที่ไม่มีจุดในชื่อหรือไม่?
glenn jackman

คำตอบ:


118
for f in *.jpg; do mv "$f" "${f%.jpg}"; done
for f in *; do mv "$f" "$f.jpg"; done

8
อันที่สองเหมาะสำหรับการเปลี่ยนชื่อไฟล์นามสกุล! ขอบคุณ!
anon58192932

2
อันที่สองเพิ่มส่วนขยายในไฟล์ทั้งหมดไม่ใช่แค่ไฟล์ที่ไม่มีนามสกุล
Jeff

5
เช่นเดียวกับโน้ต"${f%.jpg}"คือการจัดการสตริง bash shell `$ {string% substring}` ลบการจับคู่ที่สั้นที่สุดของ $ substring จากด้านหลัง $ string
Jichao

คำเตือน: หากคุณมีโฟลเดอร์ที่มีนามสกุลผสมกันโปรดทราบว่าข้อมูลข้างต้นจะเพิ่ม.jpgเข้าไปในไฟล์ปกติได้
sachinruk

61

คุณสามารถใช้การเปลี่ยนชื่อ:

rename 's/(.*)/$1.jpg/' *

3
คุณใช้การเปลี่ยนชื่อรุ่นใด Mine มีข้อโต้แย้งที่แตกต่างกัน:rename from to file...
B Johnson

1
การเปลี่ยนชื่อรวมอยู่ใน perl ซึ่งเป็นเวอร์ชัน 5.10.1
Kim Stebel

3
สิ่งนี้ใช้งานได้ดีกับการเปลี่ยนชื่อที่รวมอยู่ใน Ubuntu (ดังนั้นฉันจึงเดาว่า Distros ที่ใช้ Debian ทั้งหมด) มีรายละเอียดน้อยกว่าคำตอบของ jm666 มาก
Roger Heathcote

28

อีกวิธีหนึ่ง - ไม่มีลูป

find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep  'JPEG image data' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.jpg

ทำให้พังถล่ม:

  • ค้นหาไฟล์ทั้งหมดที่ไม่มีนามสกุล
  • ตรวจสอบประเภทไฟล์
  • กรองเฉพาะไฟล์ JPG
  • ลบข้อมูลประเภทไฟล์
  • xargs เรียกใช้ "mv" สำหรับแต่ละไฟล์

คำสั่งด้านบนนี้ใช้สำหรับ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...

คุณสามารถใส่มันเข้าไปในลูปและ xargs นี้ไม่จำเป็น ฉันชอบคำตอบของ Ryan ดีกว่าในสถานการณ์นี้
Lucius

1
@Lucius - btw คำถามต้องการไฟล์ "extensionless" - ดังนั้น Ryan ควรหาเฉพาะไฟล์เหล่านั้น ...
jm666

@ jm666 เฮ้! ฉันจะแก้ไขข้อมูลโค้ดของคุณเพื่อเปลี่ยนชื่อไฟล์ที่ไม่มีส่วนขยายทั้งหมดในโฟลเดอร์เป็นนามสกุลตามลำดับได้อย่างไร (ฉันตรวจพบนามสกุลที่ถูกต้องโดยใช้คำสั่ง file -b $ filename)
Soumyajit

24

ง่าย cd ​​ไปยังไดเร็กทอรีที่ไฟล์ของคุณอยู่และ:

for f in *;do mv $f $f.jpg;done

ด้วยเหตุผลบางอย่างสิ่งนี้ใช้ได้กับฉัน แต่วิธีแก้ปัญหาของ Seth ด้วยเครื่องหมายคำพูดไม่ได้ (OSX Mountain Lion bash)
delrocco

4
จะดีกว่าถ้าใช้for f in *;do mv "$f" "$f".jpg;doneเพื่อรองรับช่องว่างในชื่อไฟล์
Hritik

ขอบคุณสำหรับวิธีการแก้ปัญหาที่หรูหราและเรียบง่าย - ฉันได้รับคำตอบนี้หลายครั้ง แต่ดูเหมือนจะจำไม่ได้ #dejavu
Tim Andersen



1

ในกรณีของฉันฉันไม่ทราบประเภทไฟล์ดังนั้นฉันจึงใช้คำสั่งmvด้วยความช่วยเหลือของคำสั่งfileเพื่อตรวจสอบและอาจพบประเภทไฟล์ โซลูชันนี้อาจไม่สมบูรณ์แบบสำหรับไฟล์ทั้งหมดเนื่องจากคำสั่งfileอาจไม่รู้จักประเภทไฟล์ แต่ส่วนใหญ่ทำงานได้ดีสำหรับฉัน

for f in *; do ext=$(file $f | awk '{print $2;}'); mv -n "$f" "$f.$ext"; done

การใช้ awk คือการตัดคำที่สองของสตริงที่ส่งคืนจากไฟล์คำสั่งที่เป็นนามสกุลจริง


จัดการ jpg และ png โดยอัตโนมัติ ใช้แล้วได้ผล - ขอบคุณมาก! ตอนนี้ส่วนขยายเท่านั้นที่เป็น CAPS ปัญหาเล็ก ๆ น้อย ๆ :)
krivar

0
rename --dry-run * -a ".jpg" # test  
* -a ".jpg" # rename

--dry-runและไม่สามารถใช้ได้ในรุ่นของฉัน-a renameหากเป็นสิ่งที่เฉพาะเจาะจงสำหรับสถาปัตยกรรมบางอย่างควรระบุ
Fernando César

0

คุณสามารถใช้หลายไฟล์ย้าย ฉันเป็นผู้ดูแลโครงการนี้ ไวยากรณ์เป็นเรื่องง่าย

mmf files*

มันจะเปิด $ EDITOR ของคุณด้วยชื่อไฟล์ทั้งหมดหรือเป็นกลุ่มตามค่าเริ่มต้นและคุณสามารถไฮไลต์ส่วนท้ายของชื่อไฟล์ทั้งหมดโดยใช้ Ctrl + v + G เป็นกลุ่มบันทึกไฟล์ออกจากนั้นไฟล์ทั้งหมดของคุณจะถูกเปลี่ยนชื่อ


-2

ไรอันลี่

ไวยากรณ์ที่ถูกต้องสำหรับการเพิ่มนามสกุลไฟล์ให้กับไฟล์หลาย ๆ ไฟล์ภายในไดเร็กทอรีที่ไม่มีนามสกุลไฟล์คือ

find . | while read FILE; do if [[ -n `file --mime-type "$FILE" | grep 'message/rfc822'` ]]; then  mv "$FILE" "$FILE".eml; fi; done;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.