Eu tenho um diretório com muitos arquivos nele.
Quero compactar os primeiros 5 mil arquivos nesse diretório file.tar.gz
e depois 5.001 - 10.000 ... e assim por diante
como fazer isso?
Responder1
Use ls para gerar a lista de nomes e head e tail para filtrá-los. Aqui está uma linha que faz isso em um loop. Você precisará saber o número de arquivos no diretório (ls | wc -l lhe dirá).
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
Substitua os bits em maiúsculas pelo que você deseja.
Responder2
Este script adiciona gradualmente todos os arquivos ao arquivo e numera o arquivo. Renomeie ARCHIVE_NAME e '5000'.
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
Este script não está otimizado, portanto existem algumas regras:
- ARCHIVE_NAME# não deve existir ao iniciar este script, então se algo falhar, faça um 'rm ARCHIVE_NAME*'.
- Uma entrada de diretório é tratada como 1 entrada pelo script, mas não como 'tar'. Tar irá para o diretório e adicionará todos os arquivos recursivamente, e você poderá acabar com mais de 5.000 arquivos em um arquivo.
- Arquivos compactados não podem ser atualizados, deixei de fora '-z', desculpe :-)
Responder3
Você poderia construir um conjunto de arquivos que liste cada 5.000 nomes de arquivos e usá-los com os argumentos -T para tar. Algo assim pode funcionar:
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done