Tar: избегать архивирования файлов больше определенного размера

11

Я хочу архивировать файлы (с tar) размером менее 3 МБ. Но я также хочу сохранить каталоги, в которых эти файлы существуют. (поэтому я не могу использовать findкоманду). Я просто хочу избежать файлов размером более 3 МБ. Как это может быть сделано?

nixnotwin
источник
2
Так почему ты не можешь использовать findснова?
Игнасио Васкес-Абрамс
Может ли команда find сохранить каталоги нетронутыми?
nixnotwin

Ответы:

23

Проще, чем вы думаете:

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

На полусвязанной заметке (касающейся вашего утверждения, что вы не можете использовать find), чтобы получить список всех файлов (включая каталоги) по пути минус файлы размером более 3 МБ, используйте:

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

Вы могли бы тогда сделать:

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

Но я бы предпочел первый, так как он проще, четко выражает то, что вы хотите, и приведет к меньшему количеству сюрпризов.

MikeyB
источник
2
+1 Что! Вежливый, дружелюбный человек на SF?!?
Jongosi
1
+1 такие же отложения. слишком много эгоистичных троллей на SF в последнее время.
Патоши パ ト シ
* настроения: P :)
MikeyB
1

Если имя файла содержит квадратные скобки, в некоторых системах его необходимо исключить явно. Например

$ 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
Чен Дэн-Та
источник
0

Если вы пытаетесь сделать это на сервере через SSH, он не будет работать из-за этого . Чтобы обойти это, вы можете использовать pipe и xargs:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Вой
источник