Tôi có một thư mục với khoảng 20K tệp. Các tập tin được đặt tên theo mẫu xy_{\d1,5}_{\d4}\.abc
, ví dụ xy_12345_1234.abc
. Tôi muốn nén 10K đầu tiên trong số họ bằng lệnh này:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
tuy nhiên tệp kết quả chỉ có khoảng 2K tệp bên trong.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l
tuy nhiên trả về 10000, như mong đợi.
Dường như với tôi rằng tôi đang hiểu nhầm một cái gì đó cơ bản ở đây ...
Tôi đang sử dụng zsh 5.0.2 trên Linux Mint 17.1, GNU tar 1.27.1
BIÊN TẬP:
việc giả mạo như được đề xuất bởi @Archemar nghe có vẻ rất hợp lý, với ngã ba mới nhất ghi đè lên tệp kết quả - tệp chứa 'đuôi' của các tệp - 7773 đến 9999 .
kết quả của xargs --show-limit
:
Your environment variables take up 3973 bytes
POSIX upper limit on argument length (this system): 2091131
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2087158
Size of command buffer we are actually using: 131072
thay thế -c
bằng -r
hoặc -u
không hoạt động trong trường hợp của tôi. Thông báo lỗi làtar: Cannot update compressed archives
sử dụng cả hai -r
và -u
không hợp lệ và không thành công vớitar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
thay thế -c
bằng -a
dường như cũng không hợp lệ và thất bại với điều tương tự tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options
mặc dù tôi không nhận ra vấn đề azf
và Acdtrux
dường như không phù hợp với tôi.
EDIT 2:
-T có vẻ là một cách tốt, tôi cũng đã tìm thấy một ví dụ ở đây .
Tuy nhiên khi tôi cố gắng
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T -
tôi có
tar: option requires an argument -- 'T'
tốt, có lẽ tên tập tin không đạt tar? Nhưng có vẻ như họ, làm bởi vì khi tôi thực thi
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T -
tôi có
tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Vậy tại sao tar không nhìn thấy tên tập tin?
ls
find
, có -print0
tùy chọn sử dụng byte null làm dấu phân cách thay vì dòng mới. sort
có thể xử lý điều đó với -z
cờ. head
, thật không may, không xử lý hiểu các dấu phân cách byte null, nhưng câu trả lời này có một giải pháp sử dụng tr
để trao đổi \n
và \0
trước và sau head
. tar
có --null -T -
đọc rỗng phân định tên tập tin từ stdin
.