Tránh đường dẫn không mong muốn trong tệp Zip


49

Tôi đang tạo một kịch bản shell để đóng gói một số tệp. Tôi đang nén một thư mục như thế này:

zip -r /Users/me/development/something/out.zip /Users/me/development/something/folder/

Vấn đề là kho lưu trữ out.zip kết quả có toàn bộ đường dẫn tệp trong đó. Đó là, khi được giải nén, nó sẽ có toàn bộ đường dẫn "/ Users / me / Development / otherthing /" trong đó. Có thể tránh những đường dẫn sâu này khi đưa một thư mục vào một kho lưu trữ?

Khi tôi chạy zip từ bên trong thư mục đích, tôi không gặp vấn đề này.

zip -r out.zip ./folder/

Trong trường hợp này, tôi không nhận được tất cả rác. Tuy nhiên, kịch bản trong câu hỏi sẽ được gọi từ bất cứ đâu.

FWIW, tôi đang sử dụng bash trên Mac OS X 10.6.

Câu trả lời:


85

Tập lệnh của bạn nên sử dụng cdhoặc pushdpopdđể di chuyển vào thư mục sẽ là thư mục gốc của kho lưu trữ trước khi ban hành ziplệnh. Làm thế nào bạn làm điều này chính xác sẽ phụ thuộc vào cách tập lệnh biết những gì để nén. Nhưng, nếu bạn muốn / Người dùng / tôi / phát triển / thứ gì đó / thư mục được nén với các đường dẫn nội bộ của ./folder , bạn cần thực hiện việc này:

pushd /Users/me/development/something
zip -r /path/to/out.zip ./folder/
popd

Điều đó sẽ dẫn đến out.zip của bạn có chứa các đường dẫn tương đối bạn muốn.

Nếu bạn cần trợ giúp về kịch bản đó, bạn sẽ cần cho chúng tôi xem kịch bản của bạn.


8
không vấn đề gì. tôi làm điều này trong một lớp lót trên dòng lệnh mọi lúc, ví dụ: $ pushd /some/path ; do-something ; popd... hoặc thậm chí với các chuỗi con:$ ( cd /some/path ; do-something )
quack quixote

1
@ ~ quack: +1 đặc biệt cho kỹ thuật shell phụ trong bình luận.
Jonathan Leffler

1
Mặc dù sử dụng &&thay vì ;là một ý tưởng tốt để lệnh khác không chạy nếu cdthất bại (lỗi chính tả hoặc sự cố khác):(cd /some/path && do-something)
Chris Johnsen

3
Có cách nào để làm điều này mà không chỉ định đường dẫn tuyệt đối cho tệp zip không?
cam80

2
Tại sao bạn chơi game với con đường? Tại sao không sử dụng zip -j?
jww

5

Vấn đề là kho lưu trữ out.zip kết quả có toàn bộ đường dẫn tệp trong đó.
...
Có thể tránh những đường dẫn sâu này khi đưa một thư mục vào kho lưu trữ không?

Đúng. Sử dụng -jtùy chọn với zip. -jlà "rác đường dẫn". Theo trang người đàn ông trên zip :

Chỉ lưu trữ tên của tệp đã lưu (rác đường dẫn) và không lưu trữ tên thư mục. Theo mặc định, zip sẽ lưu trữ đường dẫn đầy đủ (liên quan đến thư mục hiện tại).

Sử dụng -jcó nghĩa là lệnh sau:

zip -j myarchive.zip file1.txt dir1/file2.txt dir2/dir3/file3.txt ../file4.txt

Sẽ tạo một kho lưu trữ trông như:

myarchive.zip
    |
    +-- file1.txt
    +-- file2.txt
    +-- file3.txt
    +-- file4.txt

5
Không phải điều này cũng rác tất cả các đường dẫn, ngay cả những đường dẫn trong thư mục 'thư mục'? Tôi nghĩ rằng OP chỉ muốn thoát khỏi đường dẫn trên dòng lệnh.
Peter Jaric

1
Đây có thể không phải là câu trả lời cho câu hỏi này, nhưng đó là những gì tôi cần.
Aaron McMillin

1
Câu trả lời này không chính xác giả định người dùng muốn một zip phẳng. Đây là một giả định xấu và có thể khiến tập lệnh bị lỗi nếu hai tệp trong các thư mục con khác nhau có cùng tên.
Andrew Schwartz

1

pushdpopd$OLDPWD. Giả sử $PWD/Users/me/developmentlàm:

pushd something/folder
zip -r $OLDPWD/something/out.zip *
popd

Bây giờ đã $PWDtrở lại/Users/me/development

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.