Dividir arquivo e saber quantos arquivos foram gerados

4

Estou usando as seguintes linhas para dividir um arquivo em partes menores:

split --line-bytes=100M -d $input $output/FILENAME
echo "$input was split into ??? 100MB files." >> demo.log

Depois disso, eu preciso escrever em um arquivo de log quantos arquivos menores foram gerados a partir desta divisão. Existe alguma maneira de fazer isso?

    
por Geralt 09.03.2016 / 15:57

1 resposta

2

A maneira mais fácil é simplesmente salvar os nomes das partes resultantes em uma matriz, por exemplo,

splitarr=($output/FILENAME*)

e obtenha o comprimento da matriz (número de elementos) com ${#splitarr[@]} . Isso pressupõe que os únicos nomes de arquivos correspondentes a esse padrão sejam aqueles produzidos pelo comando split .

Parece que você está usando gnu split , e aqui estão outras maneiras de fazer isso: você pode adicionar a opção --verbose (consulte a página man para obter detalhes) e contar as linhas que split imprime em stdout e salve isso em uma variável:

ct=$(split --verbose --line-bytes=100M -d $input $output/FILENAME | wc -l)

Você pode obter o mesmo resultado com a opção menos conhecida --filter :

ct=$(split --filter='printf %s\n;cat >$FILE' --line-bytes=100M -d $input $output/FILENAME | wc -l)

Como alternativa, se você souber que somente o comando split criará arquivos nesse diretório nos próximos N segundos, poderá usar inotifywatch para reunir estatísticas para, por exemplo, close_write event:

inotifywatch . -t 20 -e close_write

assistirá o diretório atual para close_write eventos pelos próximos 20 segundos e exibirá algo como:

Establishing watches...
Finished establishing watches, now collecting statistics.
total  close_write  filename
11     11           ./

Portanto, é apenas uma questão de extrair esse número da tabela (por exemplo, canalizá-lo para awk 'END{print $2}' ; também tenha em mente que as duas primeiras linhas são impressas em stderr )

    
por 09.03.2016 / 16:24