Arquivar recursivamente pequenos arquivos na árvore de documentos no linux?

3

Dado um diretório base (como /home/user ), existe um comando que poderia ser executado, o qual criaria um arquivo de backup de todos os arquivos de texto (ou seja, arquivos menores que 100kb) nesse diretório e seus filhos? Eu sei que você pode tar / gz um diretório - mas o que acontece com a exclusão de arquivos também?

A ideia é que a maioria das fotos, vídeos e outros arquivos grandes sejam ignorados, enquanto todos os documentos importantes digitados manualmente podem ser facilmente copiados para backup ao mover-se em projetos e servidores.

UPDATE

Usando o incrível código do skinp, consegui fazer backup de uma pequena quantidade dos arquivos. No entanto, como DerfK apontou - há um limite para o tamanho dos argumentos que você pode passar para os comandos. Com isso em mente, consegui escrever o conteúdo de find esperando poder usar algo para ler o conteúdo em tar e ignorar esse limite. A outra outra opção parece ser um script sh que pode publicar cada arquivo no arquivo de cada vez.

find /home/username -type f -size -100k > list.of.small.files.txt

Que renderiza um arquivo de 6MB.

    
por Xeoncross 19.10.2010 / 20:09

3 respostas

4

Olhando para as outras respostas postadas aqui até agora, estou preocupado que os usos que vejo de xargs e find -exec {} sejam errôneos. Se e quando a lista de arquivos aumentar o suficiente para que tar -c seja executado por xargs mais de uma vez, o arquivo tar preenchido nesse ponto será sobrescrito. Assim, somente os arquivos da última invocação de tar serão finalizados no tarfile.

Aqui está um one-liner que deve sempre funcionar, independentemente do número total de arquivos, e independentemente de os nomes de arquivos conterem novas linhas incorporadas:

find /home/user -type f -size -100k -print0 | tar -c -z --null --files-from=- -f backup.tgz

O comando find gera uma lista de nomes de arquivos com terminação nula para backup, e o comando tar lê essa lista a partir do canal e cria o tarfile backup.tgz .

    
por 20.10.2010 / 02:43
3

Tente

find /home/user -type f -size -100k -print0 | xargs -0 tar cvzf tarfile.tar.gz

que também será seguro para arquivos com espaços no nome.

    
por 19.10.2010 / 20:37
3

Eu usaria o poder de encontrar:

find /home/user -type f -size -100k -exec tar cvzf backup.tgz {} \+

type: especifica que você deseja um arquivo e não um diretório
tamanho: com o número precedido por -, significa que queremos menos de 100k
exec: executa o tar com {} sendo os arquivos encontrados, \ + significa final do exec

Você também pode usar xargs:

find /home/user -type f -size -100k | xargs tar cvzf backup.tgz

Atualização:

tar como um comando para acrescentar um arquivo a um arquivo tar existente (talvez até não existente, funciona para mim).

Aqui está um exemplo simples de script:

find . -type f -size -100k -print > filelist
for i in 'cat filelist'
do
    tar --append $i --file=backup.tar
done
gzip backup.tar

Obviamente, este script é altamente ineficiente ... Ele só adiciona um arquivo de cada vez, iniciando o comando tar o tempo que houver arquivos.
Seria bom fazer o roteiro de uma forma que acrescente 1000 arquivos em cada passagem ...

    
por 19.10.2010 / 20:23