เป็นไปได้ไหมที่จะเปลี่ยนชื่อไฟล์ในไฟล์ zip ก่อนที่จะแตกไฟล์?


4

ฉันดึงไฟล์ zip จากเว็บซึ่งบรรจุในระบบที่มีการเข้ารหัสชื่อไฟล์ในรูปแบบโปรแกรม unzip ที่ฉันอ่านไม่ได้ บางทีระบบไฟล์อาจไม่รองรับอักขระแปลก ๆ หรือตัวเชลล์ ฉันไม่แน่ใจทั้งหมด

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

อาการดังต่อไปนี้:


$ unzip -l 3688232.zip ; unzip 3688232.zip 
Archive:  3688232.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
   107937  10-24-2012 01:00   [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
     6354  10-24-2012 01:00   le.gout.des.autres.(3688232).nfo
---------                     -------
   114291                     2 files
Archive:  3688232.zip
error:  cannot create [-?M+?V+?e-?] Le Gout Des autres - Agn+?s Jaoui - 2000 (sep subs).srt
        Invalid or incomplete multibyte or wide character

$ unzip --help 
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

หมายเหตุ:
ฉันไม่สนใจคำแนะนำที่เกี่ยวข้องกับผู้จัดเก็บกราฟิกเพราะฉันประสบความสำเร็จในการแตกไฟล์โดยใช้ `wine WinRAR.exe '


คุณไม่สามารถเปลี่ยนชื่อไฟล์ได้ด้วยเครื่องมือปกติในขณะที่อยู่ในไฟล์ ZIP วิธีที่ดีที่สุดที่คุณสามารถทำได้คือเปลี่ยนชื่อไฟล์เมื่อคุณแตกไฟล์
Daniel R Hicks

แม้ว่าคุณจะทำได้ แต่ด้วยเครื่องมือที่ผิดปกติเล็กน้อย (ตัวแก้ไข hex) ไปที่ไฟล์และ "zap" อักขระ "คี่" (แทนที่ด้วย "x" เช่น) มันต้องใช้ความรู้เล็กน้อยเกี่ยวกับรูปแบบ ZIP แต่ชื่อเป็นข้อความที่ชัดเจนดังนั้นมันจึงไม่ใช่เรื่องยาก คุณจำเป็นต้องปะทะกันพวกมันในสองแห่ง แต่ในกรณีทั่วไป
Daniel R Hicks

คำตอบ:


2

คุณลองได้unzip -p file.zip archivedfilename.ext > newfilename.extไหม


ที่เชื่อมไฟล์ทั้งหมดเข้าด้วยกัน funzip ดีกว่าสำหรับวัตถุประสงค์นั้นเนื่องจากคุณได้รับเฉพาะไฟล์แรกใน stdout แต่คุณจะพบปัญหาหากไฟล์ที่ต้องการไม่ใช่ "ไฟล์แรกในไฟล์เก็บถาวร"
ЯрославРахматуллин

ดังนั้นแม้ว่าคุณจะระบุชื่อของไฟล์ที่เก็บถาวร (ที่มีสัญลักษณ์ตัวแทนเพื่อจัดการกับปัญหาของตัวอักษรที่ไม่ถูกต้อง), unzip ยังแยกไฟล์ทั้งหมดหรือไม่
Karan

ฉันอ่านคำตอบของคุณผิด งานนี้: unzip -p 3688232.zip * srt> moo.srt
ЯрославРахматуллин

3

ฉันจัดการเพื่อรับไฟล์ทั้งหมดด้วย Python:

import zipfile
z = zipfile.ZipFile('file.zip')
for i, f in enumerate(z.filelist):
    f.filename = 'file_{0:03}'.format(i)
    z.extract(f)

นอกจากนี้คุณยังจะได้รับไฟล์ว่าง ๆ ที่เกี่ยวข้องกับรายการไดเรกทอรี



0

แพ็คเกจ GNU Info-Zip มีโปรแกรมที่เรียกว่าzipnoteอนุญาตให้คุณแก้ไขชื่อไฟล์ในไฟล์ zip และจัดการความคิดเห็นของไฟล์ ("หมายเหตุ")

zipnote -w file.zip <<<$'@ oldname\n@=newname'

ดูเหมือนว่าคุณต้องรู้จักชื่อเก่าอย่างแน่นอน ไม่มีการสนับสนุนสัญลักษณ์แทน

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

unzip -Z1 file.zip |
awk '{ printf "file%06i %s\n", NR, $1 }' |
while read -r to from; do
    printf '@ %s\n@=%s\n' "$from" "$to" | zipnote -w file.zip
done

(หมายเหตุเล่ห์เหลี่ยมเพื่อพิมพ์ชื่อไฟล์ที่ถูกทำให้"$to"เป็นอันดับแรกในสคริปต์ Awk)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.