Tôi có một thư mục chứa một số thư mục con. Có một câu hỏi về việc nén các tập tin có chứa một câu trả lời mà tôi đã từng sửa đổi đôi chút cho nhu cầu của mình.
for i in */; do zip "zips/${i%/}.zip" "$i*.csv"; done
Tuy nhiên, tôi gặp phải một vấn đề kỳ quái. Đối với bộ thư mục đầu tiên, nơi zips/<name>.zip
không tồn tại, tôi gặp lỗi này:
zip error: Nothing to do! (zips/2014-10.zip)
zip warning: name not matched: 2014-11/*.csv
tuy nhiên khi tôi chỉ echo
báo cáo zip:
for i in */; do echo zip "zips/${i%/}.zip" "$i*.csv"; done
Sau đó chạy lệnh echo ( zip zips/2014-10.zip 2014-10/*.csv
), nó hoạt động tốt và nén thư mục. Sau đó, điều thú vị ở đây là các lần chạy tiếp theo của lệnh gốc sẽ thực sự nén các thư mục không hoạt động lần đầu tiên!
Để tự kiểm tra hành vi này:
cd /tmp
mkdir -p 2016-01 2016-02 2016-03 zips
for i in 2*/; do touch "$i"/one.csv; done
for i in 2*/; do touch "$i"/two.csv; done
zip zips/2016-03.zip 2016-03/*.csv
for i in 2*/; do echo zip "zips/${i%/}.zip" "$i*.csv"; done
for i in 2*/; do zip "zips/${i%/}.zip" "$i*.csv"; done
Bạn sẽ thấy rằng tiếng vang in ra những tuyên bố này:
zip zips/2016-01.zip 2016-01/*.csv
zip zips/2016-02.zip 2016-02/*.csv
zip zips/2016-03.zip 2016-03/*.csv
Tuy nhiên, lệnh zip thực tế sẽ cho bạn biết:
zip warning: name not matched: 2016-01/*.csv
zip error: Nothing to do! (zips/2016-01.zip)
zip warning: name not matched: 2016-02/*.csv
zip error: Nothing to do! (zips/2016-02.zip)
updating: 2016-03/one.csv (stored 0%)
updating: 2016-03/two.csv (stored 0%)
Vì vậy, nó thực sự cập nhật tệp zip với .csv
s nơi tệp zip tồn tại, nhưng không phải khi tệp zip được tạo. Và nếu bạn sao chép một trong các lệnh zip:
$ zip zips/2016-02.zip 2016-02/*.csv
adding: 2016-02/one.csv (stored 0%)
adding: 2016-02/two.csv (stored 0%)
Sau đó chạy lại zip-all-the-thing:
for i in 2*/; do zip "zips/${i%/}.zip" "$i*.csv"; done
Bạn sẽ thấy rằng nó cập nhật cho 2016-02
và 2016-03
. Đây là đầu ra của tôi về tree
:
.
├── 2016-01
│ ├── one.csv
│ └── two.csv
├── 2016-02
│ ├── one.csv
│ └── two.csv
├── 2016-03
│ ├── one.csv
│ └── two.csv
└── zips
├── 2016-02.zip
└── 2016-03.zip
Ngoài ra, (un) đáng ngạc nhiên, điều này hoạt động tốt:
zsh -c "$(for i in 2*/; do echo zip "zips/${i%/}.zip" "$i*.csv"; done)"
Tôi làm gì sai ở đây? (lưu ý, tôi đang sử dụng zsh thay vì bash, nếu điều đó tạo ra sự khác biệt)
zip zips/2014-10.zip 2014-10/*.csv
(cũng được thêm vào Q)
*cvs
tập tin hiện có, không thiếu .zip
. Bạn có thể cho chúng tôi một ví dụ tối thiểu về cấu trúc thư mục / tệp bạn đang sử dụng để chúng tôi có thể tạo lại nó và kiểm tra lỗi không?