Lưu trữ Zip với số lượng tệp có hạn


12

Tôi có thể sử dụng lệnh nào để tạo zips với giới hạn số tệp? Tôi có một thư mục (không có thư mục con) gồm 5000 tệp, vì vậy tôi muốn có một lệnh có thể chia số đó và tạo 10 ziplưu trữ riêng lẻ , mỗi tệp chứa không quá 500 tệp.

Tôi cũng không muốn 10 ziptệp kết quả được kết nối với nhau, để tôi có thể mở chúng riêng lẻ và không cần phải mở cả 10 tệp cùng một lúc.

Câu trả lời:


13

Bạn có thể sử dụng GNU song song để làm điều đó vì nó có thể giới hạn số lượng phần tử cho một công việc cũng như cung cấp số công việc (cho một tên lưu trữ zip duy nhất):

$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
  adding: 1 (stored 0%)
  adding: 10 (stored 0%)
  adding: 11 (stored 0%)
  adding: 12 (stored 0%)
  adding: 13 (stored 0%)
  adding: 14 (stored 0%)
  adding: 15 (stored 0%)
  adding: 16 (stored 0%)
  adding: 17 (stored 0%)
  adding: 18 (stored 0%)
  adding: 19 (stored 0%)
  adding: 2 (stored 0%)
  adding: 20 (stored 0%)
  adding: 3 (stored 0%)
  adding: 4 (stored 0%)
  adding: 5 (stored 0%)
  adding: 6 (stored 0%)
  adding: 7 (stored 0%)
  adding: 8 (stored 0%)
  adding: 9 (stored 0%)
$ ls
1   11  13  15  17  19  20  4  6  8  arch1.zip  arch3.zip
10  12  14  16  18  2   3   5  7  9  arch2.zip  arch4.zip

Tùy chọn -N 5giới hạn số lượng tệp là 5 trên mỗi tệp lưu trữ và được trình bày zipthay cho{}

{#}( Nguyên văn, không được thay thế bởi bạn trong khi gọi), được thay thế bằng số công việc, dẫn đến arch1.zip, arch2.zipv.v.

Các -print0tùy chọn để find-0tùy chọn để parallelsong song chắc chắn rằng tên tập tin với các nhân vật đặc biệt được xử lý một cách chính xác.


Tôi đã gặp lỗi này: i.imgur.com/JoyPrfY.png Từ lệnh này: find *! -name "* .zip" -type f -print0 | song song -0 -N 500 vòm zip {13} {}
user8547

@ user8547 không phải là song song GNU, nhưng song song được bao gồm trong moreutils, bạn biên dịch và cài đặt tốt nhất từ ​​nguồn để có các bản vá bảo mật mới nhất. ftp.gnu.org/gnu/abul/abul-latest.tar.bz2
Anthon

2
@ user8547 không, chỉ cần chạy sudo apt-get install parallel.
terdon

2
@ user8547 tại sao arch{13}? Bạn thực sự cần phải sử dụng #nhân vật. Bạn đang sử dụng vỏ gì?
Anthon

2
@ user8547 Không, đó là cách để nói song song để đặt số công việc ở đó, rất vui vì nó đã hoạt động.
Anthon

1

Một thay thế chỉ có vỏ: xử lý các lô tệp COUNT thông qua "${@:START:COUNT}"(phạm vi tham số vị trí) và shift COUNTtrong khi tăng bộ đếm cđể đặt tên cho tài liệu lưu trữ:

bộ -- *
c = 1
trong khi (($ #)); làm
  nếu [$ # -ge COUNT ]; sau đó
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    thay đổi COUNT địa chỉ
  khác
    zip $ {c} .zip "$ {@}"
    thay đổi $ #
  fi
làm xong

1

Câu trả lời được chấp nhận làm việc hoàn toàn tốt cho tôi. :) NHƯNG, trong trường hợp bạn không có quyền truy cập song song (ai biết tại sao), đây là một giải pháp thay thế mà tôi đã đưa ra trước đây:

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

Việc này sẽ tạo myarch1.zip, myarch2.zip, myarch3.zip, v.v. Bạn có thể muốn sử dụng thủ thuật -0 mà Anthon đề xuất, nếu bạn có tên tệp lạ.

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.