Unzip ไฟล์ทั้งหมดในไดเรกทอรี


203

ฉันมีไดเรกทอรีไฟล์ ZIP (สร้างขึ้นในเครื่อง Windows) ฉันสามารถคลายซิปด้วยตนเองโดยใช้unzip filenameแต่ฉันจะแตกไฟล์ ZIP ทั้งหมดในโฟลเดอร์ปัจจุบันผ่านเชลล์ได้อย่างไร?

ใช้เซิร์ฟเวอร์ Linux Ubuntu

คำตอบ:


395

สิ่งนี้ใช้ได้ใน bash ตามลิงค์นี้ :

unzip \ *. zip


2
ผมจำเป็นต้องมีเครื่องหมายกับzsh ฉันไม่รู้เหตุผลที่คุณต้องการถ้าคุณใช้ Bash
Don McCurdy

จะเกิดอะไรขึ้นกับไฟล์ที่ซ้ำกัน ฉันเดาว่ามันจะแทนที่เหรอ?
kerner1000

ใช้งานได้ดีกับ macOS 😀
Ahi Tuna

1
เมื่อทำสิ่งนี้ฉันจะได้รับชื่อไฟล์ที่ไม่ตรงกับไฟล์ zip ทั้งหมดในไดเรกทอรี
thebeancounter

1
เวอร์ชันที่มีเครื่องหมายคำพูดทำงานให้ฉันใน WSL ชื่อไฟล์ยังมีช่องว่างในนั้น FWIW
Max Candocia

107

เพียงใส่เครื่องหมายอัญประกาศเพื่อหนีไวด์การ์ด:

unzip "*.zip"

2
+1 อันนี้ใช้ได้สำหรับฉัน ฉันต้องคลายซิปชื่อไฟล์ด้วยรูปแบบเฉพาะขณะที่ จำกัด ส่วนที่เหลือ ฉันแค่เก็บรูปแบบการจับคู่ไว้ในเครื่องหมายคำพูดคู่และมันก็ทำงานได้เหมือนมีเสน่ห์ เอาท์พุทบอกฉันจำนวนของคลังเก็บประมวลผลสำเร็จ
Lalit Kumar B

ทำงานได้อย่างสวยงามบน Ubuntu สำหรับระบบย่อย Windows, 11/18/2018 คำตอบยอดนิยมใช้งานไม่ได้
julianstanley

64

สคริปต์ทุบตีต่อไปนี้จะแตกไฟล์ zip ทั้งหมดในไดเรกทอรีปัจจุบันไปยังไฟล์ dirs ใหม่ด้วยชื่อไฟล์ของไฟล์ zip เช่น:

ไฟล์ต่อไปนี้:

myfile1.zip
myfile2.zip 

จะถูกแยกไปที่:

./myfile1/files...
./myfile2/files...

เชลล์สคริปต์:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done

4
นี่คือสิ่งที่จะเอาชนะทุกสิ่ง ไม่อยากเชื่อเลยว่าจะไม่ได้รับคะแนนสูงกว่านี้
billynoah

สิ่งนี้ไม่จัดการกับช่องว่างในชื่อไฟล์
David Oliver

1
เพียงเพิ่มเครื่องหมายคำพูด"ลงในชื่อไฟล์
CONVid19

1
`ช่วยชีวิตฉันไว้! ขอบคุณ! ฉันกำลังทำการวนลูปเปิดเครื่องรูดดำเนินการคัดลอกคัดลอกบางสิ่งบางอย่างออก สิ่งที่ขาดหายไปคือวิธีการเปลี่ยนจาก file.gz ไปเป็นไฟล์ตัวแปรในสคริปต์ทุบตี
thahgr

38

unzip * .zip หรือถ้าอยู่ในโฟลเดอร์ย่อย

find . -name "*.zip" -exec unzip {} \;

unzip ทำการประมวลผลไวด์การ์ดดังนั้นไฟล์ที่เรียกว่า "* .zip" จะไม่ทำสิ่งที่คุณคาดหวัง
geocar

3
ที่จริงแล้วสิ่งนี้จะทำในสิ่งที่คาดหวังผลลัพธ์ของการดำเนินการค้นหาจะถูกส่งไปยังเครื่องรูด
John Bargman

1
สิ่งนี้จะแยกไฟล์ zip ทั้งหมดในไดเรกทอรีปัจจุบันจะเกิดอะไรขึ้นถ้าฉันต้องการให้มีการแยกไฟล์ zip (อยู่ในโฟลเดอร์ย่อย) ในโฟลเดอร์ย่อยที่เกี่ยวข้อง
Rishabh Agrahari

2
@RishabhAgrahari ผมจ่าหน้าความคิดเห็นของคุณในคำตอบใหม่
jojo

สำหรับgzip'edไฟล์ใช้gunzip -rfk .สำหรับการคลายไฟล์ซ้ำภายในโฟลเดอร์ที่เกี่ยวข้อง
Devaroop

17

เปิดเครื่องรูด.zipไฟล์ทั้งหมดและจัดเก็บเนื้อหาในโฟลเดอร์ใหม่ด้วยชื่อเดียวกันและในโฟลเดอร์เดียวกันกับ.zipไฟล์:

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

นี่คือส่วนขยายของคำตอบและที่อยู่ของ@ phatmanace @ RishabhAgrahari :

สิ่งนี้จะแยกไฟล์ zip ทั้งหมดในไดเรกทอรีปัจจุบันจะเกิดอะไรขึ้นถ้าฉันต้องการให้มีการแยกไฟล์ zip (อยู่ในโฟลเดอร์ย่อย) ในโฟลเดอร์ย่อยที่เกี่ยวข้อง


1
สำหรับgzip'edไฟล์ใช้gunzip -rfk .สำหรับการคลายไฟล์ซ้ำภายในโฟลเดอร์ที่เกี่ยวข้อง
Devaroop

2
เริ่มfind: illegal option -- nใช้UnZip 6.00 - ใครอีกบ้าง?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;คุณลืมรายชื่อไดเรกทอรี
SaundersB

16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

การดำเนินการนี้จะแตกซิปไฟล์บีบอัดทั้งหมดลงในโฟลเดอร์ใหม่ที่ตั้งชื่อด้วยชื่อไฟล์ของไฟล์เก็บถาวรซิป

a.zip b.zip c.zipจะถูกคลายซิปลงในa b cโฟลเดอร์ตามลำดับ


6

aunpack -e *.zipพร้อมatoolติดตั้ง มีข้อได้เปรียบที่จัดการกับข้อผิดพลาดได้อย่างชาญฉลาดและแยกออกเป็นไดเรกทอรีย่อยเว้นแต่ zip จะมีเพียงไฟล์เดียว ดังนั้นจึงไม่มีอันตรายที่ทำให้เกิดมลพิษในไดเรกทอรีปัจจุบันที่มีไฟล์จำนวนมากเนื่องจากมีunzipไฟล์ zip ที่ไม่มีโครงสร้างไดเรกทอรี


6

ในเชลล์ POSIX ใด ๆ สิ่งนี้จะแตกไฟล์ในไดเรกทอรีอื่นสำหรับไฟล์ซิปแต่ละไฟล์:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

1
หรือเป็นสายการบินfor file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn


2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done


1
ยอดเยี่ยมสำหรับฉัน เปิดเครื่องรูดในโฟลเดอร์ย่อยของพวกเขาตามลำดับ
insign

ปลอดภัยกว่าที่จะทำfor file in *.zip; do ...ถูกไหม?
peterflynn

1

หากเป็นไฟล์gzip'dต่างๆ จากนั้นใช้:

gunzip -rfk .

จากไดเรกทอรีรากไปยังแยกไฟล์ซ้ำในไดเรกทอรีที่เกี่ยวข้องโดยการเก็บไฟล์เดิม (หรือลบ-kเพื่อลบพวกเขา)


0

นี่คือตัวแปรของคำตอบของPedro Lobito โดยใช้วิธีวนลูปผ่านไดเรกทอรีซ้ำ ๆ เพื่อลบไฟล์ที่มีคำสอนส่วนขยายบางอย่าง :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done



-3

ใช้

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

เพื่อคลายซิปโฟลเดอร์ใน linux


ไฟล์นี้จะทำการคลายซิปไฟล์เดียว คำถามคือการคลายซิปโฟลเดอร์ทั้งหมด
Vivek Panday

เพื่อความเป็นธรรมชื่อเรื่อง "Unzip All Files ใน A Directory" อาจคลุมเครือและยังหมายถึง "Unzip ไฟล์เก็บถาวรเดียวลงในไดเรกทอรีแยกต่างหาก"
jdersen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.