ฉันมีรูปแบบไฟล์ต่างกันประมาณ 12,000 รูป แต่รูปทุกรูปเปลี่ยนเป็น * .jpg
ตอนนี้ฉันต้องการให้ส่วนขยายที่เหมาะสมกลับคืนมาฉันจะทำอย่างไร
ฉันมีรูปแบบไฟล์ต่างกันประมาณ 12,000 รูป แต่รูปทุกรูปเปลี่ยนเป็น * .jpg
ตอนนี้ฉันต้องการให้ส่วนขยายที่เหมาะสมกลับคืนมาฉันจะทำอย่างไร
คำตอบ:
คุณสามารถทำได้ง่ายๆในการทุบตี:
for f in *jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
นี่คือความคิดเช่นเดียวกับคำตอบ @ AB แต่ใช้เปลือก globs find
แทน ${f%%.*}
เป็นชื่อไฟล์โดยไม่มีนามสกุลของตน -0
ของfile
คำสั่งที่ทำให้มันพิมพ์\0
หลังจากชื่อไฟล์ที่เรานั้นใช้grep
ประเภทของไฟล์ สิ่งนี้ควรทำงานกับชื่อไฟล์โดยพลการรวมถึงชื่อที่มีช่องว่างการขึ้นบรรทัดใหม่หรือสิ่งอื่นใด นี่${type,,}
เป็นเคล็ดลับในการรับส่วนขยายตัวพิมพ์เล็ก มันจะเปลี่ยนไปPNG
png
คุณไม่ได้พูดในคำถามของคุณ แต่ถ้าคุณต้องการสิ่งนี้เพื่อเรียกซ้ำและสืบสู่ไดเรกทอรีย่อยคุณสามารถใช้สิ่งนี้แทน:
shopt -s globstar
for f in **/*jpg; do
type=$(file -0 -F" " "$f" | grep -aPo '\0\s*\K\S+')
mv "$f" "${f%%.*}.${type,,}"
done
shopt -s globstar
จะเปิดใช้ตัวเลือก GLOBSTAR ทุบตีซึ่งช่วยให้**
ไดเรกทอรีย่อยการแข่งขัน:
GLOBSTAR
หากตั้งค่ารูปแบบ ** ที่ใช้ในบริบทการขยายชื่อพา ธ จะจับคู่ไฟล์ทั้งหมดและไดเรกทอรีหรือไดเรกทอรีย่อยเป็นศูนย์หรือมากกว่า หากรูปแบบตามด้วย / เฉพาะไดเรกทอรีและไดเรกทอรีย่อยที่ตรงกัน
**
สามารถเรียกเก็บเงินคืนในไดเรกทอรีย่อย
file
ไม่ได้ระบุนามสกุล แต่อย่างใด: มันเปลี่ยนไฟล์ทุบตีเป็นfoo.bourne-again
ตัวอย่าง!
สคริปต์ด้านล่างสามารถใช้ไป (ซ้ำ) เปลี่ยนชื่อนามสกุลตั้งไม่ถูกต้อง.jpg
ในการที่ถูกต้อง ในกรณีที่พบไฟล์ที่ไม่สามารถอ่านได้มันจะรายงานในเอาต์พุตของสคริปต์
สคริปต์ที่ใช้imghdr
โมดูลที่จะรับรู้ประเภทต่อไปนี้: rgb
, gif
, pbm
, pgm
, ppm
, tiff
, rast
, xbm
, jpeg
, ,bmp
png
เพิ่มเติมเกี่ยวกับimghdr
โมดูลที่นี่ รายการสามารถขยายได้ด้วยประเภทอื่น ๆ ตามที่กล่าวไว้ในลิงค์
เนื่องจากมันเป็นเฉพาะการเปลี่ยนชื่อไฟล์ที่มีนามสกุล.jpg
ตามที่กล่าวไว้ในคำถาม ด้วยการเปลี่ยนแปลงเล็กน้อยสามารถเปลี่ยนชื่อส่วนขยายใด ๆ หรือชุดของส่วนขยายเฉพาะให้เป็นส่วนเสริมที่ถูกต้อง (หรือไม่มีส่วนขยายเช่นที่นี่ )
#!/usr/bin/env python3
import os
import imghdr
import shutil
import sys
directory = sys.argv[1]
for root, dirs, files in os.walk(directory):
for name in files:
file = root+"/"+name
# find files with the (incorrect) extension to rename
if name.endswith(".jpg"):
# find the correct extension
ftype = imghdr.what(file)
# rename the file
if ftype != None:
shutil.move(file, file.replace("jpg",ftype))
# in case it can't be determined, mention it in the output
else:
print("could not determine: "+file)
rename.py
เรียกใช้โดยคำสั่ง:
python3 /path/to/rename.py <directory>
หมายเหตุ: วิธีการของฉันดูเหมือนจะซับซ้อนเกินไป ฉันต้องการคำตอบ terdons ในสถานที่ของคุณ
คุณสามารถใช้คำสั่งfile
เพื่อกำหนดประเภทไฟล์:
% file 20050101_14-24-37_330.jpg
20050101_14-24-37_330.jpg: JPEG image data, EXIF standard 2.2, baseline, precision 8, 1200x1600, frames 3
% file test.jpg
test.jpg: PNG image data, 1192 x 774, 8-bit/color RGBA, non-interlaced
ด้วยข้อมูลนี้ไฟล์สามารถเปลี่ยนชื่อ:
กรุณาทำการทดสอบก่อนที่คุณจะใช้คำสั่งกับภาพของคุณ
find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} |
awk -F " image data" '{print $1}' |
awk -F"<separator> " '{
system("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)
}'
ตัวอย่าง
% find . -type f -name "*.jpg"
./test.jpg
./sub/20050101_14-24-37_330.jpg
% find . -type f -iname "*.jpg" -print0 | xargs -0 -I{} file -F"<separator>" {} | awk -F " image data" '{print $1}' | awk -F"<separator> " '{system ("mv \""$1"\" $(dirname \""$1"\")/$(basename -s .jpg \"" $1 "\")."$2)}'
% find . -type f -iname "*"
./test.PNG
./sub/20050101_14-24-37_330.JPEG
find -exec bash -c "..."
และทำทุกอย่างในนั้นหรือใช้while read -d '' name type
เพื่อแยกชื่อไฟล์และfile
เอาท์พุทแล้วแยกวิเคราะห์$type
เพื่อรับชนิดไฟล์ ไม่คุ้มค่าจริงๆดูคำตอบของฉันสำหรับวิธีการที่จะทำได้ง่ายขึ้นในทุบตีบริสุทธิ์