Tar: unikaj archiwizacji plików większych niż określony rozmiar


11

Chcę archiwizować pliki (z tar) o rozmiarze poniżej 3 MB. Ale chcę również zachować katalogi, w których te pliki istnieją. (więc nie mogę użyć findpolecenia). Chcę tylko uniknąć plików o rozmiarze powyżej 3 MB. Jak można to zrobić?


2
Dlaczego więc nie możesz użyć findponownie?
Ignacio Vazquez-Abrams

Czy polecenie find może zachować nienaruszone katalogi?
nixnotwin

Odpowiedzi:


23

Prostsze niż myślisz:

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

W przypadku częściowo powiązanej notatki (odnoszącej się do stwierdzenia, że ​​nie można użyć funkcji znajdź), aby uzyskać listę wszystkich plików (w tym katalogów) pod ścieżką pomniejszoną o pliki większe niż 3 MB, użyj:

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

Możesz wtedy zrobić:

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

Ale wolę pierwszy, ponieważ jest prostszy, wyraźnie wyraża to, czego chcesz i doprowadzi do mniej niespodzianek.


2
+1 Co! Grzeczna, przyjazna osoba na SF?!?
Jongosi

1
+1 takie same osady. ostatnio zbyt wiele egoistycznych trolli na SF.
Patoshi パ ト シ

* sentymenty: P :)
MikeyB 27.04.16

1

Jeśli nazwa pliku zawiera nawiasy kwadratowe, w niektórych systemach należy je wyraźnie wykluczyć. Na przykład

$ 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

Jeśli próbujesz to zrobić na serwerze za pośrednictwem SSH, z tego powodu nie będzie działać . Aby obejść ten problem, możesz użyć potoków i xargs:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.