ฉันมีไฟล์ที่มีตัวอักษรไม่ถูกต้องเช่นนี้
009_-_�%86ndringshåndtering.html
มันเป็นÆ
สิ่งที่ผิดพลาดในชื่อไฟล์
มีวิธีลบตัวอักขระที่ไม่ถูกต้องทั้งหมดหรือไม่?
หรืออาจtr
จะใช้อย่างใด
echo "009_-_�%86ndringshåndtering.html" | tr ???
ฉันมีไฟล์ที่มีตัวอักษรไม่ถูกต้องเช่นนี้
009_-_�%86ndringshåndtering.html
มันเป็นÆ
สิ่งที่ผิดพลาดในชื่อไฟล์
มีวิธีลบตัวอักขระที่ไม่ถูกต้องทั้งหมดหรือไม่?
หรืออาจtr
จะใช้อย่างใด
echo "009_-_�%86ndringshåndtering.html" | tr ???
คำตอบ:
วิธีหนึ่งจะอยู่กับ sed:
mv 'file' $(echo 'file' | sed -e 's/[^A-Za-z0-9._-]/_/g')
แทนที่file
ด้วยชื่อไฟล์ของคุณแน่นอน สิ่งนี้จะแทนที่สิ่งที่ไม่ใช่ตัวอักษร, ตัวเลข, จุด, ขีดเส้นใต้หรือขีดกลางด้วยเครื่องหมายขีดล่าง คุณสามารถเพิ่มหรือลบตัวอักษรเพื่อให้เป็นไปตามที่คุณต้องการและ / หรือเปลี่ยนอักขระการแทนที่เป็นอย่างอื่นหรือไม่มีอะไรเลย
f='file'; mv 'file' ${f//[^A-Za-z0-9._-]/_}
ฉันคิดว่าคุณอยู่ในกล่อง Linux และไฟล์ที่ทำในกล่อง Windows Linux ใช้ UTF-8 เป็นการเข้ารหัสอักขระสำหรับชื่อไฟล์ในขณะที่ Windows ใช้อย่างอื่น ฉันคิดว่านี่เป็นสาเหตุของปัญหา
ฉันจะใช้ "convmv" นี่คือเครื่องมือที่สามารถแปลงชื่อไฟล์จากการเข้ารหัสอักขระหนึ่งไปยังอีก สำหรับยุโรปตะวันตกสิ่งเหล่านี้ใช้ได้ผลตามปกติ:
convmv -r -f windows-1252 -t UTF-8 .
convmv -r -f ISO-8859-1 -t UTF-8 .
convmv -r -f cp-850 -t UTF-8 .
หากคุณต้องการติดตั้งบน Linux ที่ใช้ Debian คุณสามารถทำได้โดยการเรียกใช้:
sudo apt-get install convmv
มันใช้งานได้สำหรับฉันทุกครั้งและกู้คืนชื่อไฟล์ดั้งเดิม
ที่มา: LeaseWebLabs
Save the current file in Word 97-2004 format\sco.workflow
ที่สร้างขึ้นบน Mac ของฉัน (ผ่าน Microsoft Office) และการเข้ารหัสข้างต้นไม่มีผลใด ๆ
--notest
ตัวเลือกในการเปลี่ยนชื่อไฟล์จริง
ฉันคิดว่าคุณหมายถึงคุณต้องการสำรวจระบบไฟล์และแก้ไขไฟล์ดังกล่าวทั้งหมดหรือไม่
นี่คือวิธีที่ฉันทำ
find /path/to/files -type f -print0 | \
perl -n0e '$new = $_; if($new =~ s/[^[:ascii:]]/_/g) {
print("Renaming $_ to $new\n"); rename($_, $new);
}'
ที่จะค้นหาไฟล์ทั้งหมดที่มีอักขระที่ไม่ใช่ ASCII และแทนที่อักขระเหล่านั้นด้วยเครื่องหมายขีดล่าง ( _
) โปรดใช้ความระมัดระวังหากไฟล์ที่มีชื่อใหม่มีอยู่แล้วไฟล์นั้นจะถูกเขียนทับ สคริปต์สามารถแก้ไขเพื่อตรวจสอบกรณีเช่นนี้ แต่ฉันไม่ได้ใส่ไว้ในเพื่อให้ง่าย
ทำตามคำตอบได้ที่https://stackoverflow.com/questions/2124010/grep-regex-to-match-non-ascii-charactersคุณสามารถใช้:
rename 's/[^\x00-\x7F]//g' *
ที่*
ตรงกับไฟล์ที่คุณต้องการที่จะเปลี่ยนชื่อ หากคุณต้องการทำมากกว่าหลายไดเรกทอรีคุณสามารถทำสิ่งต่อไปนี้:
find . -exec rename 's/[^\x00-\x7F]//g' "{}" \;
คุณสามารถใช้อาร์กิวเมนต์ -n rename
เพื่อทำการรันแบบแห้งและดูว่าอะไรจะเปลี่ยนแปลงโดยไม่เปลี่ยน
ฉันมีไฟล์ภาษาญี่ปุ่นบางไฟล์ที่มีชื่อไฟล์ที่เสียหายที่กู้คืนมาจากแท่ง usb ที่เสียหายและวิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน
ฉันแนะนำแพ็คเกจดีท็อกซ์:
ยูทิลิตี้ล้างพิษจะเปลี่ยนชื่อไฟล์เพื่อให้ทำงานง่ายขึ้น มันลบช่องว่างและสิ่งรบกวนอื่น ๆ นอกจากนี้ยังจะแปลหรือล้างอักขระละติน -1 (ISO 8859-1) ที่เข้ารหัสใน ASCII 8 บิตอักขระ Unicode เข้ารหัสใน UTF-8 และ CGI หนีอักขระ
ตัวอย่างการใช้งาน:
detox -r -v /path/to/your/files
-r Recurse ในไดเรกทอรีย่อย -v เป็น verbose เกี่ยวกับไฟล์ที่ถูกเปลี่ยนชื่อ -n สามารถใช้สำหรับการแห้ง (แสดงเฉพาะสิ่งที่จะเปลี่ยน)
detox
จะคิดค้นล้อใหม่ หากคุณดูที่หน้าคนคุณจะเห็นว่ามันครอบคลุมโซลูชันที่เสนออื่น ๆ ทั้งหมดที่นี่เนื่องจากความยืดหยุ่น
的节奏啊
แต่ตัวละครเหล่านั้นเป็นชื่อไฟล์ที่ถูกต้อง
เชลล์สคริปต์นี้ทำให้ sanitizes ไดเรกทอรีซ้ำเพื่อให้ไฟล์แบบพกพาระหว่าง Linux / Windows และ FAT / NTFS / exFAT มันเอาตัวควบคุม, /:*?"<>\|
และบางส่วนชื่อของ Windows COM0
ลิขสิทธิ์ชอบ
sanitize() {
shopt -s extglob;
filename=$(basename "$1")
directory=$(dirname "$1")
filename_clean=$(echo "$filename" | sed -e 's/[\\/:\*\?"<>\|\x01-\x1F\x7F]//g' -e 's/^\(nul\|prn\|con\|lpt[0-9]\|com[0-9]\|aux\)\(\.\|$\)//i' -e 's/^\.*$//' -e 's/^$/NONAME/')
if (test "$filename" != "$filename_clean")
then
mv -v "$1" "$directory/$filename_clean"
fi
}
export -f sanitize
sanitize_dir() {
find "$1" -depth -exec bash -c 'sanitize "$0"' {} \;
}
sanitize_dir '/path/to/somewhere'
ในทางทฤษฎีลีนุกซ์มีข้อ จำกัด น้อยกว่า ( /
และ\0
ห้ามใช้อย่างเคร่งครัดในชื่อไฟล์) แต่ในทางปฏิบัติตัวละครหลายตัวอาจรบกวนคำสั่ง bash (เช่น*
... ) ดังนั้นจึงควรหลีกเลี่ยงในชื่อไฟล์
แหล่งที่ดีสำหรับข้อ จำกัด ในการตั้งชื่อไฟล์:
หากคุณต้องการจัดการบรรทัดใหม่ฝังตัวอักขระหลายไบต์ช่องว่างเครื่องหมายขีดกลางเครื่องหมายทับขวาและช่องว่างที่คุณต้องการสิ่งที่แข็งแกร่งกว่าให้ดูคำตอบนี้:
https://superuser.com/a/858671/365691
ฉันวางสคริปต์บน code.google.com หากใครสนใจ: rnf-bash-rename-script
ฉันใช้สายการบินเดียวนี้เพื่อลบอักขระที่ไม่ถูกต้องในไฟล์คำบรรยาย:
for f in *.srt; do nf=$(echo "$f" |sed -e 's/[^A-Za-z0-9.]/./g' |sed 's/\.\.\././g' |sed 's/\.\././g'); test "$f" != "$nf" && mv "$f" "$nf" && echo "$nf"; done
สำหรับไฟล์ใน *; ทำ mv "$ file" $ (echo "$ file" | sed -e 's / [^ A-Za-z0-9. -] / / g'); เสร็จแล้ว