Giải nén một loạt các tập tin


33

Khi tôi cố gắng

 unzip filename.zip

nó hoạt động Tuy nhiên, tôi cần giải nén một loạt các tệp zip.

Tại sao:

 find . -name "*.zip" -print0 | xargs -0 unzip

hoặc là

 ls *.zip | xargs unzip

không làm việc?

Trong cả hai trường hợp, tôi nhận được thông báo "thận trọng: tên tệp không khớp:".

Câu trả lời:


48

Bạn có thể ra lệnh:

$ unzip '*.zip'

Nhìn vào đây để tham khảo .


Tôi đã không nói rõ ràng, nhưng chúng không phải là tất cả trong cùng một thư mục. Vì vậy, tôi cần đầu ra của find.
jeannoburto

4
Cảm ơn. Điều này có thể phù hợp với câu hỏi thực tế một cách hoàn hảo nhưng điều này đã giải quyết vấn đề của tôi. Tôi đã cố gắng unzip *và nó trở lại caution: filename not matchedcho mọi tập tin nhưng unzip '*.zip'đã làm công việc.
Ivan

27

Các lệnh của bạn không hoạt động vì chúng nhồi tất cả các tệp vào cùng một dòng lệnh. Mặc dù hoạt động với hầu hết các chương trình, unzipsẽ lấy đối số đầu tiên làm tệp zip và bất kỳ đối số nào sau tệp đầu tiên làm tệp trích xuất từ ​​nó. Bạn cần thực thi lệnh một lần cho mỗi tệp:

find . -name "*.zip" -print0 | xargs -0 -n1 unzip

Hoặc là

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

Cái thứ hai có vẻ tốt hơn trong trường hợp thực sự có rất nhiều tập tin. (Nếu không, nó đã phàn nàn lệnh quá dài với xargs)
Recct

5

Trong bash bạn cũng có thể làm như sau:

for i in *.zip; do
    unzip "$i"
done

Cũng unzipcó thể thực hiện -dchuyển đổi để bạn có thể nhắm mục tiêu đầu ra đến các vị trí khác nhau.

Ví dụ:

uzdir=/path/to/unzips
for i in *.zip; do
    [ -d "$uzdir/$i" ] || mkdir -p "$uzdir/$i"
    unzip "$i" -d "$uzdir/$i"
done

1

Có một giải pháp dễ dàng hơn nhiều so với các vòng lặp được đưa ra ở trên, sử dụng -dcờ thư mục :

unzip -o somefiles.zip -d $directoryPath

-dchỉ định thư mục cần trích xuất, không phải thư mục cần tìm trong tệp.
LegendaryDude
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.