Eu tenho uma pasta com cerca de 20 mil arquivos. Os arquivos são nomeados de acordo com o padrão xy_{\d1,5}_{\d4}\.abc, por exemplo xy_12345_1234.abc. Eu queria comprimir os primeiros 10K deles usando este comando:
ls | sort -n -k1.4,1.9 | head -n10000 | xargs tar -czf xy_0_10000.tar.gz
no entanto, o arquivo resultante tinha apenas cerca de 2K arquivos dentro.
ls | sort -n -k1.4,1.9 | head -n10000 | wc -l no entanto retorna 10000, conforme o esperado.
Parece-me que estou entendendo mal algo básico aqui ...
Estou usando o zsh 5.0.2 no Linux Mint 17.1, o GNU tar 1.27.1
EDITAR:
forjar como sugerido por @Archemar soa muito plausível, com o fork mais recente sobrescrevendo o arquivo resultante - o arquivo contém a 'cauda' dos arquivos - 7773 para 9999 .
Resultado de 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
substituindo -c com -r ou -u não funcionou no meu caso. A mensagem de erro foi tar: Cannot update compressed archives
usando ambos -r e -u é inválido e falha com tar: You may not specify more than one '-Acdtrux', '--delete' or '--test-label' option
substituindo -c com -a parece ser inválido também e falha com o mesmo tar: You must specify one of the '-Acdtrux', '--delete' or '--test-label' options embora eu não reconheça o problema azf e Acdtrux parecem disjuntos para mim.
EDIT 2:
-T parece um bom caminho, eu também encontrei um exemplo Aqui .
No entanto, quando tento
ls | sort -n -k1.4,1.9 | head -n10000 | tar -czf xy_0_10000.tar.gz -T - eu recebo tar: option requires an argument -- 'T'
bem, talvez os nomes dos arquivos não alcancem o alcatrão? Mas parece que eles, porque quando eu executo
ls | sort -n -k1.4,1.9 | head -n10000 | tar --null -czf xy_0_10000.tar.gz -T - eu recebo tar: xy_0_.ab\nxy_1_...<the rest of filenames separated by literal \n>...998.ab
Cannot stat: File name too long
Então, por que o tar não está vendo os nomes dos arquivos?
ls
find, que tem um -print0 opção para usar um byte nulo como o delimitador em vez de uma nova linha. sort pode lidar com isso com o -z bandeira. head, infelizmente não manipula entender delimitadores de bytes nulos, mas esta resposta tem uma solução usando tr trocar \n e \0 antes e depois head. tar tem --null -T - ler nomes de arquivos delimitados por nulo de stdin.