Tha thứ cho câu hỏi cơ bản nhất này, nhưng tôi không thể tìm thấy câu trả lời trực tiếp hoặc ví dụ đơn giản về trao đổi ngăn xếp.
Giả sử tôi có một thư mục tệp mà tôi muốn nén thành một tệp zip mà tôi có thể chia sẻ với những người bạn Windows khủng khiếp của mình (nếu không tôi chỉ sử dụng tar
và hoàn thành nó). Nó trông như thế này:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Giả sử tôi đã zip
cài đặt:
sudo apt-get install zip
Tôi thấy từ man zip
đó cho phép tôi sử dụng một danh sách tập tin:
- @ danh sách tập tin. Nếu danh sách tệp được chỉ định là - @ [Không có trên MacOS], zip sẽ lấy danh sách các tệp đầu vào từ đầu vào tiêu chuẩn thay vì từ dòng lệnh. Ví dụ,
zip -@ foo
Vì vậy, tôi đã tạo ra zip.lst
trông như thế này:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
Và bây giờ tôi đã thử:
zip -@ zip.lst
Nhưng nó không làm gì cả, ngoại trừ tạo một dòng trống trên bàn điều khiển. Và tôi có thể tiếp tục đẩy Entervà nó chỉ tiếp tục tạo ra nhiều dòng trống hơn mà dường như không thực thi lệnh. Sau một số tìm kiếm, tôi nhận ra rằng tôi cần phải chấm dứt đầu vào bằng cách nhấn Ctrl+D
Nhưng bây giờ tôi gặp lỗi này:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
Gì!? Làm thế nào là danh sách đơn giản của tôi không phải là một "cấu trúc tệp hợp lệ"? Quay lại hướng dẫn để biết thêm thông tin và tôi xem kỹ hơn:
Nếu danh sách tệp được chỉ định là - @ ...
Vì vậy, tôi đã thử nó mà không có -@
, và ít nhất là xử lý nó ngay lập tức mà không cần phải nhấn Ctrl+ Dnhưng tôi vẫn để lại lỗi tương tự .
May mắn thay, tôi tìm thấy một nhận xét về một câu trả lời cho một câu hỏi gần như không liên quan khiến tôi nhận ra rằng tôi cần phải đặt tên rõ ràng cho tệp zip. Lỗi này là do mặc định nó đang cố tạo một tệp zip có tên zip.lst
. Nhưng vì đó là tên của danh sách của tôi, người ta có thể nghĩ rằng nó chỉ đơn giản sẽ ghi đè lên nó, nhưng không, thực tế nó đang cố gắng cập nhật nó. Và vì danh sách rõ ràng không phải là tệp zip, chúng tôi gặp lỗi cấu trúc tệp không hợp lệ và bây giờ thì rõ ràng lý do tại sao nó nói "có thể không phải là tệp zip." Vì vậy, sau đó tôi đã cố gắng:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Eureka! Tôi có thể thấy tệp zip đã được tạo và thư mục của tôi hiện chứa tệp này:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Nhưng hãy đợi trước khi chúng tôi ăn mừng, hãy xác nhận nội dung của tệp zip trước:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Không! Chà, thực sự điều đó có ý nghĩa từ việc sử dụng tiêu chuẩn bởi vì nó chỉ nén một tệp danh sách mà tôi đã cung cấp. Cuối cùng tôi đã thử lại -@
nhưng nhận được kết quả tương tự.
Tôi đang làm gì sai?
BTW, tôi biết tôi có thể sử dụng GUI và thực hiện bằng chuột, nhưng tôi cần phải viết kịch bản này và nói chung tôi sẽ nhanh hơn trên CLI khi tôi biết tôi đang làm gì.
ls
vàgrep
và zip-@
, bạn có thể sử dụng các khối vỏ để chọn tệp trực tiếp trên dòng lệnh zip, vdzip files.zip file*
hoặczip images.zip *.jpg
. Ngoài ra, khi sử dụng danh sách tên tệp từ một tệp, bạn có thể sử dụng chuyển hướng thay vì gọi một quy trình riêng cho mèo,zip files.zip -@ < zip.lst