วิธีเปลี่ยนชื่อ / แตกไฟล์ด้วยชื่อแบบยาวในไฟล์ zip


11

ฉันมี zip ซึ่งมีไฟล์ที่มีชื่อยาวมาก

ถ้าฉันพยายามแยกข้อมูลในบรรทัดคำสั่งฉันได้รับข้อผิดพลาด "ชื่อไฟล์ยาวเกินไป"
หากฉันใช้ตัวจัดการการจัดเก็บแบบกราฟิกมันจะไม่แตกไฟล์และมันจะไม่ให้ฉันเปลี่ยนชื่อพวกเขา ปัญหาเดียวกันเกิดขึ้นถ้าฉันเมานที่เก็บถาวร

ฉันสามารถแยกและเปลี่ยนชื่อไฟล์เป็นรายบุคคลโดยใช้:

unzip -p -c example.zip "long file name.ogg" > shortname.ogg

สิ่งนี้ไม่สามารถทำได้กับไฟล์จำนวนมาก

มีเครื่องมือที่จะตัดทอนชื่อไฟล์ตามที่แยกหรือไม่


ผลลัพธ์คืออะไรunzip -l <ARCHIVE>และคุณต้องการให้ชื่อถูกตัดทอนอย่างไร คุณต้องการที่จะรักษาโครงสร้างไดเรกทอรีภายในเก็บในระหว่างการแยก?
David Foerster

คำตอบ:


13

ในการสกัด

เราสามารถใช้zipinfoเป็นส่วนหนึ่งของกระบวนการนี้มันเป็นโปรแกรมจากzipแพคเกจ

zipinfo -2 example.zip

จะแสดงเฉพาะชื่อไฟล์example.zipบางอย่างที่ดูเหมือน:

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html

เพื่อให้เราสามารถใช้คุณสมบัตินี้เพื่อแยกไฟล์ทั้งหมด:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
  • long_fname=${i%.*}: ลบส่วนขยายออกจากชื่อไฟล์แบบยาวดังนั้นในกรณีที่ชื่อไฟล์มีความยาวน้อยกว่า 256 อักขระ เราจะไม่ได้รับการขยายซ้ำ
  • ${long_fname:0:250}.${i##*.}: สร้างชื่อไฟล์ใหม่ด้วยจำนวนอักขระที่ถูกต้องนอกจากนี้ยังเพิ่ม.และนามสกุลไฟล์จริง

เพียงแค่เราทำการวนลูปในรายการไฟล์และแยกแต่ละไฟล์ด้วยชื่อไฟล์ใหม่ที่ถูกต้องซึ่งมีขนาด 256 ตัวอักษร


เพื่อเปลี่ยนชื่อ

คุณสามารถใช้zipnoteคำสั่งมันเป็นส่วนหนึ่งของzipแพ็คเกจด้วย

รับการสำรองไฟล์ zip ของคุณก่อน

เรียกใช้คำสั่งนี้:

zipnote example.zip > names

เปิดชื่อโดยใช้เครื่องมือแก้ไขมันมีลักษณะดังนี้:

@ file name long in zip and a lot of other strings in the file name
@ (comment above this line)
@ (zip file comment below this line)

เพิ่มชื่อไฟล์ใหม่เช่นนี้:

@ file name long in zip and a lot of other strings in the file name
@=new short name for above file
@ (comment above this line)
@ (zip file comment below this line)

จากนั้นให้เปลี่ยนชื่อไฟล์ใช้:

zipnote -w example.zip < names

คุณเปลี่ยนชื่อพวกเขาทั้งหมดคุณยังสามารถเขียนสคริปต์ง่าย ๆ ซึ่งจะทำสิ่งนี้ให้คุณโดยอัตโนมัติ


มันมีประโยชน์อย่างเหลือเชื่อขอบคุณ! ฉันไม่สามารถรับตัวอย่าง zipnote ให้ทำงานได้และอันแรกก็เอานามสกุลไฟล์ออก - แต่ก็ดีพอสำหรับสิ่งที่ฉันต้องทำ ขอบคุณ!
Terence Eden

ฉันอัปเดตคำตอบแล้วตอนนี้มันจะเก็บนามสกุลไว้เช่นกัน)
Ravexina

คุณควรใช้IFS= read -r iในกรณีที่ชื่อไฟล์ขึ้นต้นด้วย white space หรือมีสิ่งที่เชลล์อาจตีความว่าเป็น escape sequences
David Foerster
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.