Zip một kho lưu trữ mà không bao gồm thư mục cha


30

Tôi muốn nén nhiều thư mục trong cây thư mục như vậy

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Khi tôi cố gắng nén nó, nó kết thúc việc tạo một kho lưu trữ zip với thư mục v thay vì nội dung của nó (các thư mục con và tệp)

Làm thế nào tôi có thể tránh điều này?

Câu trả lời:


23

Vì vậy, nếu tôi hiểu chính xác, bạn đang cố lưu trữ các tệp và thư mục trong một thư mục cụ thể nhưng không bao gồm thư mục gốc.

Thí dụ:

/test/test.txt
/test/test2.txt

trong đó test.txt và test2.txt sẽ được lưu trữ trong zip, nhưng không / test /

Bạn có thể cd vào thư mục / test / sau đó chạy một cái gì đó như,

zip -r filename.zip ./*

Mà sẽ tạo một kho lưu trữ trong cùng một thư mục có tên filename.zip. Hoặc nếu chạy nó từ bên ngoài thư mục bạn có thể chạy,

zip -r test.zip test/*

/ * Là phần chỉ bao gồm nội dung của thư mục, thay vì toàn bộ thư mục.

Chỉnh sửa: OP muốn nhiều khóa, giải pháp cuối cùng là một chút hack, tôi tò mò liệu có cách nào tốt hơn để làm điều này.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

vâng nhưng tôi có rất nhiều tập tin mà tôi làm điều tương tự nên sẽ rất tẻ nhạt khi làm như vậy vì vậy có giống như một tập lệnh bash hoặc một cái gì đó sẽ tự động hóa quá trình tương tự trên thư mục có tất cả các thư mục
Dami

1
Ok tôi đã chạy tập lệnh và nó đã tạo một thư mục mẹ trong kho lưu trữ, tôi chỉ muốn nội dung của thư mục nằm trong kho lưu trữ
Dami

1
sai lầm của tôi, bỏ lỡ một chút của nó. đã thêm một tham số -j mà tôi vừa tra cứu, dường như bỏ qua phần bạn không muốn. thử cái này:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb

18
zip -r test.zip test / * từ bên ngoài thêm kiểm tra dưới dạng thư mục vào tệp zip
smihael

4
như @smihael đã nêu, zip -r test.zip test/*không hoạt động. Có cách nào chính xác để đạt được điều này từ bên ngoài thư mục không?
andrhamm

22

Sử dụng -jhoặc --junk-pathstùy chọn trong lệnh zip của bạn.

Từ trang zip man :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Đây dường như là câu trả lời chính xác.
mutant_city

3
Những gì về đường dẫn / thư mục lồng nhau mặc dù?
GuyPaddock

3
Điều này sẽ bỏ qua tất cả các thư mục trong kho lưu trữ và nếu bạn có tên tệp trùng lặp trong các thư mục khác nhau, điều này sẽ nổ tung. Điều này có vị trí của nó, nhưng chỉ khi bạn không quan tâm đến các thư mục và chỉ muốn các tệp. Không phải những gì OP yêu cầu, nhưng vẫn có kiến ​​thức tốt
Govind Rai

17

Làm thế nào về lệnh này?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Mặc dù đây là một câu trả lời đúng, nhưng phần giới thiệu không có vẻ như bạn đã tự thuyết phục mình. Nó cũng sẽ giúp để giải thích một chút, những gì lệnh làm.
Nepeavere

1
Đây cũng là giải pháp của tôi, nhưng tôi không thích nó vì nó liên quan cd. Hy vọng có một cách để xác định đường dẫn được lưu trữ chính xác hơn.
nilskp

3

Hi vọng điêu nay co ich.

(cd directory && zip -r ../out.zip .)

Nó giữ shell chính trong cùng thư mục và chỉ thay đổi thư mục của shell phụ sẽ chết sau lệnh.


Tôi muốn thêm nhận xét này vào nhận xét cho câu trả lời của @Alfred UC nhưng tôi không đủ danh tiếng cho điều đó.
Kenneth

Nếu nó thực sự giải quyết được vấn đề, thì đó có thể là một giải pháp.
Yufenyuy Veyeh Dider

Điều này là tốt hơn như là một câu trả lời. Điều này có hoạt động trong cả bash và sh?
Arlen Beiler
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.