Tar: éviter l'archivage de fichiers plus grands que certaines tailles

11

Je souhaite archiver des fichiers (avec tar) d'une taille inférieure à 3 Mo. Mais je souhaite également conserver les répertoires dans lesquels ces fichiers existent. (donc je ne peux pas utiliser la findcommande). Je veux juste éviter les fichiers dont la taille est supérieure à 3 Mo. Comment cela peut-il être fait?

nixnotwin
la source
2
Alors pourquoi ne pouvez-vous pas findréutiliser?
Ignacio Vazquez-Abrams, le
La commande find peut-elle conserver les répertoires intacts?
nixnotwin

Réponses:

23

Plus simple que vous ne le pensez:

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

Sur une note semi-liée (relative à votre déclaration que vous ne pouvez pas utiliser find) pour obtenir une liste de tous les fichiers (y compris les répertoires) sous un chemin moins les fichiers supérieurs à 3 Mo, utilisez:

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

Vous pourriez alors faire:

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

Mais je préfère le premier car il est plus simple, exprime clairement ce que vous voulez et conduira à moins de surprises.

MikeyB
la source
2
+1 Quoi! Une personne polie et sympathique sur SF?!?
Jongosi
1
+1 mêmes sédiments. trop de trolls égoïstes sur SF récemment.
Patoshi パ ト シ
* sentiments: P :)
MikeyB
1

Si le nom de fichier contient des crochets, dans certains systèmes, vous devez les exclure explicitement. Par exemple

$ 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
la source
0

Si vous essayez de le faire sur un serveur via SSH, cela ne fonctionnera pas à cause de cela . Pour contourner ce problème, vous pouvez utiliser des tuyaux et des xargs:

find /path/to/dir -type f -size -3M | xargs tar cf archive.tar
Hurler
la source