2011-11-12 15 views
40

Nếu tôi chọn tệp nén và nhấp chuột phải "trích xuất tại đây", thư mục có tên tệp zip được tạo và toàn bộ nội dung của tệp zip được trích xuất vào đó.tạo thư mục cho tệp zip và giải nén vào nó

Tuy nhiên, tôi muốn chuyển đổi một số tệp zip qua trình bao. Nhưng khi tôi làm

unzip filename.zip 

thư mục "filename" không được tạo ra nhưng tất cả các tập tin được trích xuất vào thư mục hiện hành.

Tôi đã xem xét các tham số nhưng không có tham số như vậy. Tôi cũng đã cố gắng

for zipfile in \*.zip; do mkdir $zipfile; unzip $zipfile -d $zipfile/; done 

nhưng .zip mở rộng của 2. $ zipfile và 4. $ zipfile phải được loại bỏ với sed. Nếu tôi làm

for zipfile in \*.zip; do mkdir sed 's/\.zip//i' $zipfile; unzip $zipfile -d sed 's/\.zip//i' $zipfile/; done 

nó không hoạt động.

Làm cách nào để thay thế tiện ích mở rộng .zip của $zipfile đúng cách?

Có cách nào dễ hơn so với tập lệnh hệ vỏ không?

Trả lời

77

unzip file.zip -d xxx sẽ trích xuất tệp vào thư mục xxx và xxx sẽ được tạo nếu tệp không có ở đó. Bạn có thể kiểm tra trang người đàn ông để biết chi tiết.

Dòng awk dưới đây sẽ thực hiện công việc:

ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}'|sh 

Xem kiểm tra dưới đây,

lưu ý mà tôi lấy ra |sh ở cuối, kể từ kéo khóa của tôi là tài liệu lưu trữ giả; Tôi chỉ muốn hiển thị dòng lệnh được tạo ở đây.

kent$ ls -l 
total 0 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 001.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 002.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 003.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 004.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 005.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 006.zip 
-rw-r--r-- 1 kent kent 0 Nov 12 23:10 007.zip 

kent$ ls *.zip|awk -F'.zip' '{print "unzip "$0" -d "$1}' 
unzip 001.zip -d 001 
unzip 002.zip -d 002 
unzip 003.zip -d 003 
unzip 004.zip -d 004 
unzip 005.zip -d 005 
unzip 006.zip -d 006 
unzip 007.zip -d 007 
+0

Cảm ơn, hoạt động như một sự quyến rũ. – jack

+0

Nhưng những gì tôi không hiểu là lý do tại sao $ 0 chứa tên tệp hoàn chỉnh và $ 1 không phải là phần mở rộng ".zip"? – jack

+4

@jack Tôi đã định nghĩa ".zip" làm FS (Phân tách trường). Vì vậy, 001.zip sẽ được tách thành hai phần "001" và "". $ 1 là trường đầu tiên. và $ 0 là toàn bộ dòng trong trường hợp này là "001.zip" trong awk, trường được tính từ 1, không phải 0. – Kent

31

"trích xuất tại đây" chỉ đơn thuần là tính năng của bất kỳ trình bao bọc unzip nào bạn đang sử dụng. unzip sẽ chỉ trích xuất những gì thực sự có trong kho lưu trữ. Có lẽ không có cách nào đơn giản hơn một kịch bản lệnh shell. Nhưng sed, awk vv không cần thiết cho điều này nếu bạn có một vỏ POSIX-compliant: (. Bạn PHẢI KHÔNG thoát khỏi sự mở rộng * hoặc tên đường dẫn sẽ không diễn ra)

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

Hãy lưu ý rằng nếu các kho lưu trữ ZIP chứa một thư mục, chẳng hạn như với các lưu trữ Eclipse (luôn chứa eclipse/), bạn sẽ kết thúc với ./eclipse*/eclipse/eclipse.ini trong mọi trường hợp. Thêm echo trước unzip để chạy khô.

+0

Cảm ơn bạn đã thông tin. – jack

+2

@jack, câu trả lời này phải là câu trả lời chấp nhận. Bạn KHÔNG nên sử dụng đầu ra 'ls' cho bất cứ thứ gì. 'ls' là một công cụ để tìm kiếm siêu dữ liệu thư mục tương tác. Bất kỳ nỗ lực nào khi phân tích cú pháp đầu ra 'ls' với mã đều bị hỏng. Quả cầu đơn giản hơn và chính xác hơn: 'cho tệp trong * .zip'. Đọc [Phân tích cú pháp ls] (http://mywiki.wooledge.org/ParsingLs) –

6

Nếu bạn có p7zip, phiên bản dòng lệnh của 7zip cài đặt, sau đó bạn có thể sử dụng:

7z x '*.zip' -o'*' 
1

aunpack từ atool sẽ làm điều này theo mặc định cho tất cả các loại tài liệu lưu trữ.