Giải nén tất cả các tệp trong một thư mục


203

Tôi có một thư mục chứa các tệp ZIP (được tạo trên máy Windows). Tôi có thể tự giải nén chúng bằng cách sử dụng unzip filename, nhưng làm cách nào tôi có thể giải nén tất cả các tệp ZIP trong thư mục hiện tại qua shell?

Sử dụng máy chủ Ubuntu Linux.

Câu trả lời:


395

Điều này hoạt động trong bash, theo liên kết này :

giải nén \ *. zip


2
Tôi cần dấu gạch chéo ngược với Zsh . Tôi không biết lý do bạn cần nó nếu bạn đang sử dụng Bash.
Don McCurdy

Điều gì sẽ xảy ra với các tập tin trùng lặp? Tôi đoán nó sẽ chỉ ghi đè?
kerner1000

Hoạt động tuyệt vời trên macOS
Ahi Tuna

1
Khi thực hiện điều này, tôi nhận được tên tệp không khớp với tất cả các tệp zip trong thư mục
thebeancount

1
Phiên bản có trích dẫn làm việc cho tôi trên WSL. Tên tập tin cũng có không gian trong đó, FWIW.
Max Candocia

107

Chỉ cần đặt một số trích dẫn để thoát ký tự đại diện:

unzip "*.zip"

2
+1 Cái này làm việc cho tôi. Tôi đã phải giải nén tên tệp với một định dạng cụ thể trong khi hạn chế phần còn lại. Tôi chỉ giữ định dạng phù hợp trong dấu ngoặc kép và nó hoạt động như bùa mê. Đầu ra cho tôi biết số lượng tài liệu lưu trữ được xử lý thành công.
Lalit Kumar B

Hoạt động tốt trên Ubuntu cho hệ thống con Windows, 18/11/2018. Câu trả lời hàng đầu đã không làm việc.
julianstanley

64

Tập lệnh bash sau đây trích xuất tất cả các tệp zip trong thư mục hiện tại thành các thư mục mới với tên tệp của tệp zip, nghĩa là:

Các tập tin sau:

myfile1.zip
myfile2.zip 

Sẽ được trích xuất để:

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

Kịch bản Shell:

#!/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
Đây là điều để chinh phục tất cả mọi thứ. Không thể tin rằng nó không được bình chọn cao hơn
billynoah

Điều này không đối phó với không gian trong tên tập tin.
David Oliver

1
Chỉ cần thêm dấu ngoặc kép "vào tên tệp
CONvid19

1
`đã cứu ngày của tôi! cảm ơn! Tôi đang thực hiện một số vòng lặp, giải nén, thực hiện một hành động, sao chép, grep một cái gì đó, loại bỏ. Điều còn thiếu là làm thế nào để chuyển từ file.gz sang tệp dưới dạng một biến trong tập lệnh bash
thahgr

38

giải nén * .zip hoặc nếu chúng ở trong các thư mục con, thì đại loại như

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

giải nén không xử lý ký tự đại diện để một tệp có tên "* .zip" sẽ không làm những gì bạn mong đợi.
geocar

3
Trên thực tế, điều này sẽ làm chính xác những gì được mong đợi, kết quả của hoạt động tìm kiếm đang được chuyển sang giải nén
John Bargman

1
Điều này sẽ trích xuất tất cả các tệp zip trong thư mục hiện tại, nếu tôi muốn các tệp zip (hiện diện trong các thư mục con) được trích xuất trong các thư mục con tương ứng thì sao?
Rishabh Agrahari

2
@RishabhAgrahari Tôi đã gửi bình luận của bạn trong một câu trả lời mới .
jojo

đối với gzip'edcác tệp, sử dụng gunzip -rfk .để giải nén đệ quy trong các thư mục tương ứng
Devaroop

17

Giải nén tất cả .zipcác tệp và lưu trữ nội dung trong một thư mục mới có cùng tên và trong cùng thư mục với .ziptệp:

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

Đây là phần mở rộng của câu trả lời của @ phatmanace và giải quyết nhận xét của @ RishabhAgrahari :

Điều này sẽ trích xuất tất cả các tệp zip trong thư mục hiện tại, nếu tôi muốn các tệp zip (hiện diện trong các thư mục con) được trích xuất trong các thư mục con tương ứng thì sao?


1
đối với gzip'edcác tệp, sử dụng gunzip -rfk .để giải nén đệ quy trong các thư mục tương ứng
Devaroop

2
Bắt đầu find: illegal option -- nsử dụng UnZip 6,00 - còn ai nữa không?
DanielDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Bạn quên danh sách thư mục.
SaundersB

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

Điều này sẽ giải nén tất cả các lưu trữ zip vào các thư mục mới được đặt tên với tên tệp của kho lưu trữ zip.

a.zip b.zip c.zipsẽ được giải nén vào a b ccác thư mục tương ứng.


6

aunpack -e *.zip, với atoolcài đặt. Có ưu điểm là nó xử lý các lỗi một cách thông minh và luôn giải nén vào các thư mục con trừ khi zip chỉ chứa một tệp. Do đó, không có nguy cơ gây ô nhiễm thư mục hiện tại với hàng loạt tệp, như có unziptrên một zip không có cấu trúc thư mục.


6

Trong bất kỳ shell POSIX nào, điều này sẽ giải nén vào một thư mục khác nhau cho mỗi tệp zip:

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

1
Hoặc dưới dạng một lớp lót: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
Tuyệt vời với tôi Giải nén trong các thư mục con tương ứng

Làm an toàn hơn for file in *.zip; do ...phải không?
peterflynn

1

Nếu các tập tin được gzip'd. Sau đó, chỉ cần sử dụng:

gunzip -rfk .

từ thư mục gốc để trích xuất đệ quy các tệp trong các thư mục tương ứng bằng cách giữ các tệp gốc (hoặc xóa -kđể xóa chúng)


0

Đây là một biến thể của câu trả lời Pedro lobito sử dụng Cách lặp qua thư mục theo cách đệ quy để xóa các tệp với các hướng dẫn mở rộng nhất định :

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

-2
for i in `ls *.zip`; do unzip $i; done

14
Sử dụng nguy hiểm của ls. Điều gì sẽ xảy ra nếu bạn có một tệp có tên "-j -o -d .. jackass.zip"
geocar


-3

Sử dụng

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

để giải nén một thư mục trong linux


Điều này sẽ chỉ giải nén tập tin duy nhất. Câu hỏi là giải nén tất cả các thư mục
Vivek Panday

Công bằng mà nói, tiêu đề "Giải nén tất cả các tệp trong một thư mục" thể không rõ ràng và cũng có nghĩa là "Giải nén một tệp lưu trữ vào một thư mục riêng biệt".
jderen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.