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
.