Giải nén nội dung tệp, nhưng không tạo thư mục lưu trữ


37

Tôi có một tệp myarchive.zip chứa nhiều thư mục, tệp, v.v. Giả sử tệp myarchive.zip này nằm trong một thư mục có tên là "b". Chà, khi tôi sử dụng lệnh "unzip myarchive.zip", hệ thống sẽ tạo một thư mục theo mặc định gọi là "myarchive" với nội dung của tệp zip. Tôi không muốn hệ thống tạo thư mục "myarchive" này - tôi chỉ muốn nội dung được trích xuất vào thư mục "b". Điều này có thể không?

Những gì tôi đã làm bây giờ chỉ đơn giản là ban hành lệnh "cp" để sao chép các tệp từ thư mục mới được tạo (trong trường hợp này là "myarchive" thành "b") vào nơi tôi muốn.


8
Theo mặc định, unzipkhông tạo một thư mục. Tệp zip của bạn có thể có thư mục ở cấp cao nhất.
Chris Xuống

3
Bạn có thể sử dụng mvthay vì cp. mv archive/* .; rmdir archive/hoặc tương tự.
frostschutz

Câu trả lời:


45

Phiên bản của tôi unzipcó một -jtùy chọn để không tạo bất kỳ thư mục.

Vì thế

unzip -j /path/to/file.zip

Sẽ trích xuất tất cả các tệp vào thư mục hiện tại mà không khôi phục cấu trúc thư mục được lưu trữ trong ziptệp.

Nếu bạn chỉ muốn xóa một cấp thư mục khỏi kho lưu trữ, (giải nén myarchive/dir/filedưới dạng dir/file, không file), bạn có thể sử dụng bsdtar(hỗ trợ zipcác tệp ngoài tartệp) thay vào đó và -stùy chọn của nó .

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
Khi sử dụng -jcấu trúc thư mục lưu trữ không được tạo lại và tất cả các tệp được gửi trong thư mục giải nén. Điều này có nghĩa là TẤT CẢ các thư mục con bị loại bỏ. Vì vậy, nếu bạn có zip/A/f1, zip/A/B/f2zip/A/B/C/f3bạn sẽ kết thúc với một thư mục duy nhất với F1, f2, f3. Sẽ rất thú vị nếu bạn có các tệp có cùng tên trong các thư mục con khác nhau. Thông thường bạn muốn chỉ thả thư mục trên cùng chứ không phải toàn bộ cấu trúc thư mục.
Cristian Vrabie 4/2/2016

3
@CristianVrabie, đó chính xác là những gì tôi đang nói trong câu trả lời. Tôi đã thêm một thay thế bsdtar cho những gì bạn đang hỏi. Xem chỉnh sửa.
Stéphane Chazelas 4/2/2016


1

Câu trả lời được chấp nhận không chỉ định cách thực hiện, như bạn nói trong câu hỏi, nếu bạn vẫn muốn trích xuất vào một thư mục cụ thể mà không sử dụng đường dẫn thư mục được lưu trữ trong tệp zip, bạn có thể sử dụng -jtùy chọn với -dtùy chọn theo cách này :

unzip -j /path/to/file.zip -d other_folder

hoặc cho trường hợp của bạn

unzip -j myarchive.zip -d b

2
Bạn đúng rằng bạn có thể làm điều đó; nhưng nó sẽ không tạo ra các thư mục con để bạn vẫn phải kết hợp một bước khác; Tôi khá chắc chắn rằng OP muốn đổi tên thư mục gốc của kho lưu trữ thành tên khác nhưng giữ cấu trúc còn lại trong thư mục đó.
Pryftan

-1

Nếu việc thực hiện unzip myarchive.ziptạo ra một thư mục myarchivecó mọi thứ trong đó, thì điều đó có nghĩa là người tạo tệp zip thực sự đã thực hiện zip trên thư mục đó.

Cách duy nhất để tạo ra những gì bạn muốn là chỉ cần di chuyển tất cả các nội dung bên ngoài thư mục sau khi bạn thực hiện unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ hiển thị thư mụcmyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ hiển thị cấp độ đầu tiên của myarchive (trực tiếp trong b) }


1
bạn cũng cần mv myarchive/.* .di chuyển tất cả các tệp ẩn như .gitignore và .htaccess.
Kinjal Dixit

1
@KinjalDixit Đó cũng là suy nghĩ của tôi; Antoine có một lỗ hổng chết người trong ví dụ của bạn như Kinjai chỉ ra: bởi vì bạn sử dụng rm -Rvà vì bạn không sử dụng ls -anên bạn không hiển thị nếu có bất kỳ tệp chấm nào; Bây giờ điều gì xảy ra khi bạn chạy rm -Rvà có các tệp chấm? Bạn đã không sao chép chúng để chúng bị mất. Bạn thực sự nên khắc phục điều đó và có thể giải thích sự khác biệt bởi vì đó là thứ sẽ khiến người mới gặp khá nhiều; và xem xét điều này: nếu nó không phải là một kho lưu trữ thì sao? Hoặc nếu họ thêm vào lệnh để xóa kho lưu trữ thì nó không bị nén?
Pryftan

Otoh rmdirsẽ đảm bảo rằng nó trống trước tiên ... Nhưng nếu người dùng không biết về các tệp chấm thì sẽ khiến họ nhầm lẫn.
Pryftan
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.