Trích xuất một số tệp zip, mỗi tệp trong một thư mục mới có cùng tên, qua thiết bị đầu cuối Ubuntu


37

Tôi có nhiều tệp zip a.zip, b.zip, c.zip, ... và tôi muốn trích xuất từng tệp vào các thư mục mới a, b, c, ... thông qua thiết bị đầu cuối.

Trên thực tế, những gì tôi muốn là một giải pháp mà tôi có thể sử dụng sau này findvì tôi thực sự có nhiều thư mục 2014, 2013, 2012, ... mỗi thư mục chứa nhiều tệp zip a.zip, b.zip, v.v. Nếu tôi làm find . -name "*.zip" -exec {} unzip \;nó sẽ giải nén tất cả các tập tin và đưa chúng vào thư mục cha tương ứng của chúng.


Câu trả lời:


72

Bạn sẽ có thể sử dụng -dtùy chọn giải nén để đặt thư mục thay thế cho nội dung lưu trữ.

unzip -d a a.zip
unzip -d b b.zip

vân vân Trong một findbiểu thức, bạn sẽ có thể lấy được tên cho thư mục từ tên của zipfile bằng cách sử dụng mở rộng tham số shell, vd

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

Kiểm tra nó đầu tiên bằng cách thêm một echotức là

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

hoặc một cái gì đó như

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)

2
+1 cho test it first…phần
mrzmyr

2
findcần một thư mục, vì vậyfind . -name ...
slf 31/12/18

@slf POSIXly, có - nhưng không phải trong trường hợp GNU find( "Nếu không có điểm bắt đầu được chỉ định, .được giả định." )
Steeldo 31/12/18

10

Tôi đã tự mình tìm kiếm điều này, chỉ để nhận ra rằng tôi đã thực hiện nó bằng các lệnh khác và nó có thể được áp dụng cho bất kỳ điều gì khác, theo cách mà tôi đã thực hiện nó.

Phương pháp tìm là điên quá phức tạp không có lý do.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done

Đây là câu trả lời tốt nhất cho câu hỏi trong tầm tay. Cái trước là vô lý và cái sau này không sắp xếp vào các thư mục gốc tương ứng.
TheMegolith

Làm thế nào người ta sẽ đi về việc tạo ra các thư mục mà không cần các .ziphậu tố? Yêu cầu một người bạn.
gạch ngang

Câu trả lời không tạo ra một thư mục có hậu tố .zip, đó là điểm chính của phần trong dấu ngoặc nhọn.
kencinder

6

Đơn giản chỉ cần sử dụng

unzip '*.zip' -d /home/user/folder/

11
Trừ khi tôi thiếu một cái gì đó, điều này sẽ giải nén mọi thứ vào / home / user / thư mục, không vào / home / user / thư mục / a và / home / user / thư mục / b
M. Justin

1

Tôi cũng cần phải làm điều này bằng cách sử dụng unrar. Điều này có thể đạt được bằng một sửa đổi nhỏ cho mã của kencinder.

for i in *.rar; do mkdir "${i%%.rar}"; unrar x -r "$i" "${i%%.rar}"; done 

Tái bút: Tôi muốn thêm điều này như một bình luận nhưng tôi không có đủ điểm danh tiếng!

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.