Tar: evita l'archiviazione di file di dimensioni superiori a determinate dimensioni


11

Voglio archiviare file (con tar) di dimensioni inferiori a 3 MB. Ma voglio anche conservare le directory in cui esistono quei file. (quindi non posso usare il findcomando). Voglio solo evitare i file di dimensioni superiori a 3 MB. Come si può fare?


2
Quindi perché non puoi usarlo di findnuovo?
Ignacio Vazquez-Abrams,

Il comando find può mantenere intatte le directory?
nixnotwin,

Risposte:


23

Più semplice di quanto pensi:

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

Su una nota semi-correlata (relativa alla tua affermazione che non puoi usare find) per ottenere un elenco di tutti i file (comprese le directory) in un percorso meno i file più grandi di 3 MiB, usa:

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

Potresti quindi fare:

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

Ma preferirei il primo in quanto è più semplice, esprime chiaramente ciò che vuoi e porterà a meno sorprese.


2
+1 Cosa! Una persona educata e amichevole su San Francisco?!?
Jongosi,

1
+1 stessi sedimenti. troppi troll egoistici su SF ultimamente.
Patoshi パ ト シ

* sentimenti: P :)
MikeyB,

1

Se il nome file contiene parentesi quadre, in alcuni sistemi, è necessario escluderlo esplicitamente. Per esempio

$ 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

Se stai provando a farlo su un server tramite SSH, non funzionerà per questo . Per aggirare il problema, è possibile utilizzare pipe e xargs:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.