Alcatrão: evite o arquivamento de arquivos maiores que o tamanho certo

11

Quero arquivar arquivos (com tar) com tamanho inferior a 3 MB. Mas também quero manter os diretórios em que esses arquivos existem. (então eu não posso usar o findcomando). Eu só quero evitar os arquivos com mais de 3 MB de tamanho. Como isso pode ser feito?

nixnotwin
fonte
2
Então, por que você não pode usar findnovamente?
Ignacio Vazquez-Abrams
O comando find pode manter os diretórios intactos?
Nixnotwin

Respostas:

23

Mais simples do que você pensa:

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

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

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

Você pode 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, pois é mais simples, expressa claramente o que você deseja e levará a menos surpresas.

MikeyB
fonte
2
+1 O que! Uma pessoa educada e amigável em SF?!?
Jongosi
1
+1 mesmos sedimentos. ultimamente muitos trolls egoístas em SF.
Patoshi # 26/16
* sentimentos: P :)
MikeyB
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
Chen Deng-Ta
fonte
0

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

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Uivo
fonte