Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tar : lenteur des options -u et -r

6 réponses
Avatar
kato fong
Bonjour,

Voulant archiver tous les fichiers *.jpg d'un disque dur, j'ai cru
habile de passer la commande suivante :

$ find /mnt/hd -iname "*.jpg" -exec tar rvf jpegs.tar {} \;

Tout démarre conformément à mes voeux ... mais au bout de dix bonnes
minutes, je commence à déchanter. En effet, j'ai l'impression que tout
se passe comme si l'archive entière, d'environ 500 Mo à ce moment là,
était lue avant le rajout de chaque nouveau fichier trouvé.

La lenteur de l'opération devient telle que plusieurs dizaines secondes
s'écoulent entre chaque archivage de fichier. Je n'ai pas cru utile de
poursuivre. Bien entendu, l'utilisation de l'option -u n'améliore pas
les temps d'archivage.

Quelqu'un a-t-il une astuce pour accélérer le processus d'archivage ou
une autre stratégie à proposer ?

D'avance merci

--
kf

6 réponses

Avatar
Nicolas George
kato fong wrote in message <46b5963c$0$5088$:
Quelqu'un a-t-il une astuce pour accélérer le processus d'archivage ou
une autre stratégie à proposer ?


find -print0 | tar --null -T -

avec GNU tar.

Avatar
kato fong

Quelqu'un a-t-il une astuce pour accélérer le processus d'archivage ou
une autre stratégie à proposer ?


find -print0 | tar --null -T -

avec GNU tar.


Oui. Moins de 5 minutes pour archiver les 12.023 fichiers *.jpg.

Merci

--
kf


Avatar
Marc
kato fong wrote:

$ find /mnt/hd -iname "*.jpg" -exec tar rvf jpegs.tar {} ;


Quand on peut utiliser + au lieu de ; pour find -exec (et ça semble bien
être le cas ici) c'est toujours un gain de temps appréciable. Ça sera
sans doute légèrement plus lent que l'autre réponse proposée, mais plus
standard.

Avatar
Matthieu Moy
Marc writes:

kato fong wrote:

$ find /mnt/hd -iname "*.jpg" -exec tar rvf jpegs.tar {} ;


Quand on peut utiliser + au lieu de ; pour find -exec (et ça semble bien
être le cas ici) c'est toujours un gain de temps appréciable. Ça sera
sans doute légèrement plus lent que l'autre réponse proposée, mais plus
standard.


Attention, il y a un piège ... ;-)

Je suppose que le « find ... -exec ... + » fera la même chose que
« find ... | xargs ... », c'est à dire qu'il va construire une ligne
de commande aussi longue qu'il le peut, et au moment où cette ligne
atteint le maximum (en nombre d'argument), on l'exécute, puis on
continue.

Si la commande derrière est un truc du genre "cat", ou "perl -pi
-e ...", c'est pas grave, puisque l'exécuter en plusieurs fois ne
change pas la fonctionnalité. Mais avec tar, c'est bien différent. Le
jour où tu as N+1 fichiers, si N est le max possible, tu vas
exécutuer un gros "tar ... fichier1 ... fichierN", puis un deuxième
"tar ... fichierN+1" qui va joyeusement écraser l'archive créee par la
première commande.

En clair, ça va marcher sur des petits nombres de fichiers, et planter
_silencieusement_ sur des grands nombres :-(.

--
Matthieu


Avatar
kato fong
Marc writes:
kato fong wrote:

$ find /mnt/hd -iname "*.jpg" -exec tar rvf jpegs.tar {} ;
Quand on peut utiliser + au lieu de ; pour find -exec (et ça semble bien

être le cas ici) c'est toujours un gain de temps appréciable. Ça sera
sans doute légèrement plus lent que l'autre réponse proposée, mais plus
standard.


Attention, il y a un piège ... ;-)

Je suppose que le « find ... -exec ... + » fera la même chose que
« find ... | xargs ... », c'est à dire qu'il va construire une ligne
de commande aussi longue qu'il le peut, et au moment où cette ligne
atteint le maximum (en nombre d'argument), on l'exécute, puis on
continue.


oui, c'est ce que j'ai observé avec GNU find

Si la commande derrière est un truc du genre "cat", ou "perl -pi
-e ...", c'est pas grave, puisque l'exécuter en plusieurs fois ne
change pas la fonctionnalité. Mais avec tar, c'est bien différent. Le
jour où tu as N+1 fichiers, si N est le max possible, tu vas
exécutuer un gros "tar ... fichier1 ... fichierN", puis un deuxième
"tar ... fichierN+1" qui va joyeusement écraser l'archive créee par la
première commande.

En clair, ça va marcher sur des petits nombres de fichiers, et planter
_silencieusement_ sur des grands nombres :-(.



c'est pourquoi il vaut mieux utiliser "tar rvf ..." qui évite ce piège
dans lequel je suis tombé en premier en utilisant un "tar cvf ..." ;)

--
kf



Avatar
Hugues
Ce cher kato fong a dit :

Bonjour,

Voulant archiver tous les fichiers *.jpg d'un disque dur, j'ai cru habile de
passer la commande suivante :

$ find /mnt/hd -iname "*.jpg" -exec tar rvf jpegs.tar {} ;

Tout démarre conformément à mes voeux ... mais au bout de dix bonnes minutes,
je commence à déchanter. En effet, j'ai l'impression que tout se passe comme
si l'archive entière, d'environ 500 Mo à ce moment là, était lue avant le
rajout de chaque nouveau fichier trouvé.


c'est effectivement le cas, le -exec va exécuter la commande donnée pour
*chaque* fichier trouvé..

--
Hugues - Debianiste avant tout - http://www.hiegel.fr/~hugues/Linux/