Chỉ trích xuất một tệp cụ thể từ kho lưu trữ được nén vào một thư mục nhất định


151

Tôi cần trích xuất một tệp từ tệp ZIP mà tôi biết đường dẫn đến. Có một lệnh như sau:

unzip -d . myarchive.zip path/to/zipped/file.txt

Thật không may, lệnh trên trích xuất và tạo lại toàn bộ đường dẫn đến tệp tại ./path/to/zipped/file.txt. Có cách nào để tôi chỉ cần kéo tập tin vào một thư mục được chỉ định không?

Câu trả lời:


130

Bạn chỉ có thể trích xuất văn bản thành đầu ra tiêu chuẩn với -ptùy chọn:

unzip -p myarchive.zip path/to/zipped/file.txt >file.txt

Điều này sẽ không trích xuất siêu dữ liệu (ngày, quyền, '), chỉ nội dung tệp. Đó là cái giá phải trả cho sự tiện lợi của việc không phải di chuyển tệp sau đó.

Ngoài ra, gắn kết kho lưu trữ như một thư mục và chỉ cần sao chép tệp. Với AVFS :

mountavfs
cp -p ~/.avfs"$PWD/myarchive.zip#"/path/to/zipped/file.txt .

Hoặc với cầu chì-zip :

mkdir myarchive.d
fuse-zip myarchive.zip myarchive.d
cp -p myarchive.d/path/to/zipped/file.txt .
fusermount -u myarchive.d; rmdir myarchive.d

2
@TK Kocheran: Tại sao bạn không thử nó? Tôi đã thử nghiệm lệnh đầu tiên, và nó đã làm việc.
người dùng không xác định

1
@TKKocheran: Các tệp Jar là zips, vì vậy các phương thức giải nén và fuse-zip rõ ràng sẽ hoạt động. Phương thức AVFS cũng hoạt động, vì AVFS đoán định dạng dựa trên tên tệp và biết về .jar; nếu tệp của bạn được đặt tên khác, bạn có thể cần yêu cầu AVFS sử dụng trình xử lý zip của nó, vd ~/.avfs$PWD/foo.apk#uzip/META-INF.
Gilles

1
thực ra, tôi có nghĩa là trích xuất một tệp JAR / nhị phân từ kho lưu trữ ZIP. Tôi chưa có cơ hội thử nghiệm nó, bạn có thể thấy bất kỳ vấn đề nào khi sử dụng lệnh đầu tiên ở trên để giải nén các tệp nhị phân không?
Naftuli Kay

2
@TKKocheran: Không có vấn đề gì, -ptrích xuất tệp nguyên trạng ( -ckhông chuyển đổi văn bản).
Gilles

2
Tôi nghĩ rằng câu trả lời của @Mstyle thanh lịch hơn, bởi vì nó không yêu cầu chuyển hướng đầu ra và nó bảo tồn các thuộc tính tệp.
gertvdijk

152
unzip -j "myarchive.zip" "in/archive/file.txt" -d "/path/to/unzip/to"

Nhập đường dẫn đầy đủ cho tệp nén, không chỉ tên tệp. Hãy chắc chắn giữ cấu trúc như nhìn thấy từ trong tệp zip.

Điều này sẽ trích xuất các tập tin duy nhất file.txttrong myarchive.zipđến /path/to/unzip/to/file.txt.


18
Đây là câu trả lời tốt hơn.
đốt cháy

1
Nó không xử lý trường hợp bạn muốn tên tệp được tạo khác nhau.
Oleg Vaskevich

6
tham số "-j": đường dẫn rác. Cấu trúc thư mục của kho lưu trữ không được tạo lại; tất cả các tệp được gửi trong thư mục giải nén (theo mặc định, tệp hiện tại). tham số "-d": trích xuất các tệp vào exdir
e1i45

1
@OlegVaskevich, câu hỏi không yêu cầu tên tệp mục tiêu phải khác
Tapemaster

Vâng, tôi biết. Vẫn bình chọn. :)
Oleg Vaskevich

25

Phiên bản đơn giản hơn:

unzip ARCHIVE_NAME PATH_OF_FILE_INSIDE_ARCHIVE

Điều này sẽ tạo lại PATH_OF_FILE_INSIDE_ARCHIVEtrong thư mục hiện tại nhưng chỉ trích xuất tập tin được chỉ định.

Để liệt kê tất cả các tệp trong kho lưu trữ Zip:

unzip -l ARCHIVE_NAME

2
Đơn giản hơn nhiều so với câu trả lời được chấp nhận.
FractalSpace

Thật vậy, đã hoạt động tốt và nó đơn giản hơn
Mahmoud Ali

2

Trên macOS , theo mặc định sử dụng Info-Zip

Đầu tiên liệt kê các tập tin để tìm những gì bạn muốn

unzip -l my.zip

Sau đó cung cấp một danh sách các tập tin để trích xuất từ ​​kho lưu trữ

unzip my.zip annoying/path/to/file

Kết hợp với -p cho thiết bị xuất chuẩn

unzip -p my.zip annoying/path/to/file >./file

1
Tôi không hiểu tại sao mọi người downvote mà không có lý do rõ ràng. Đây là một câu trả lời đúng (không chỉ dành cho macOS)
FractalSpace

@FractalSpace Hoàn toàn không, nó trái ngược với những gì OP muốn.
Konrad Rudolph

Điều quan trọng là nhận được một tập tin cá nhân. Đầu ra cho thiết bị xuất chuẩn và chuyển hướng sử dụng cờ -p là không đáng kể, nhưng tôi đã thêm nó một cách rõ ràng
Cameron Lowell Palmer

2

sử dụng đơn giản:

unzip zipfile.zip path/inside/zip/file.txt

và nó sẽ làm phồng tập tin.

$ unzip -l ./../html.zip | grep wp-config

     3328  07-22-2019 15:10   html/wp-config.php

     2898  01-07-2019 23:30   html/wp-config-sample.php

$ unzip ./../html.zip html/wp-config.php

     Archive:  ./../html.zip
     inflating: html/wp-config.php

$ ls -lrth

     total 4.0K
     drwxr-sr-x 2 apache apache 4.0K Jul 26 14:41 html

$ ls -lrth html/*

     total 4.0K
     -rw-rw-rw- 1 apache apache 3.3K Jul 22 15:10 wp-config.php

Cũng có thể thêm -d outpathđối số để chỉ định vị trí tệp được đặt vào.
Efren

-jđối số để tránh các đường dẫn bị nén
Efren
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.