Tar: evita o arquivamento de arquivos maiores que determinado tamanho

9

Eu quero arquivar arquivos (com tar) que estão abaixo de 3 MB de tamanho. Mas também quero manter os diretórios nos quais esses arquivos existem. (por isso não consigo usar o comando find ). Eu só quero evitar os arquivos que estão acima de 3 MB de tamanho. Como isso pode ser feito?

    
por nixnotwin 08.02.2011 / 07:22

3 respostas

19

Mais simples do que você pensa:

$ tar cf small-archive.tar /big/tree --exclude-from <(find /big/tree -size +3M)

Em uma nota semi-relacionada (relacionada à sua declaração que você não pode usar encontrar) para obter uma listagem de todos os arquivos (incluindo diretórios) em um caminho menos os arquivos maiores que 3 MiB, use:

$ find . -size -3M -o -type d

Você poderia então fazer:

$ tar cf small-archive.tar --no-recursion --files-from <(find /big/tree -size -3M -o -type d)

Mas eu prefiro o primeiro como é mais simples, claramente expressa o que você quer e vai levar a menos surpresas.

    
por 08.02.2011 / 09:11
1

Se o nome do arquivo contiver colchetes, em alguns sistemas, será necessário excluir explicitamente. Por exemplo

$ mkdir test
$ echo "abcde123456" > ./test/a[b].txt
$ echo "1" > ./test/a1.txt
$ ls -la ./test
total 16
drwxrwxr-x 2 user user 4096 Jan 10 16:38 .
drwx------ 4 user user 4096 Jan 10 16:38 ..
-rw-rw-r-- 1 user user    2 Jan 10 16:38 a1.txt
-rw-rw-r-- 1 user user   12 Jan 10 16:38 a[b].txt
$ tar -zcvpf a.tar.gz ./test
./test/
./test/a[b].txt
./test/a1.txt
$ tar -zcvpf a3.tar.gz ./test --exclude-from <(find ./test -type f -size +3c)
./test/
./test/a[b].txt
./test/a1.txt
$ tar -zcvpf ax.tar.gz ./test --exclude-from <(find ./test -type f -size +3c) --exclude '*\[*'
./test/
./test/a1.txt
    
por 10.01.2016 / 09:55
0

Se você estiver tentando fazer isso em um servidor via SSH, isso não funcionará por causa de isso . Para contornar isso, você pode usar pipes e xargs:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
    
por 09.10.2016 / 13:16