Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 08/06/2010, à 23:20

Postmortem

[Résolu] tar de plein plein de fichiers

Salut à tous !
Voilà mon souci, je souhaite "tarer" plusieurs fichiers (plusieurs veut dire plus de 10 000 !) qui sont générés par un programme.
Les fichiers sont générés dans un répertoire où il y a déjà des fichiers générés précédemment (c'est un programme qui tourne tous les lundi et jeudi). Je souhaite donc tarer seulement les nouveaux fichiers.
J'ai essayé ceci :

find . -type f -mtime 0 -exec tar cf mon_archive_$(date +%m%d).tar {} +

Ça ne fonctionne pas, car à chaque fois que le tar est effectué (plusieurs fois vu le nombre de fichiers), le tar est re-créé... Je me trouve donc avec une archive de 300 fichiers environ.

J'ai essayé ceci :

find . -type f -mtime 0 -exec tar rf mon_archive_$(date +%m%d).tar {} +

Ça ne fonctionne pas non plus car le fichier mon_archive_$(date +%m%d).tar n'existe pas.
Je pourrais créer l'archive avec un fichier bidon puis passer le find . -type f -mtime 0 -exec tar rf mon_archive_$(date +%m%d).tar {} + mais je ne trouve pas très propre le fait de mettre un fichier bidon juste pour créer mon archive.
Est ce qu'il y a moyen de créer une archive vide ? Comme ça, je pourrais passer par le tar rf
Ou si vous avez une autre idée ?
Merci d'avance !

Dernière modification par Postmortem (Le 09/06/2010, à 15:18)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#2 Le 08/06/2010, à 23:41

sensini

Re : [Résolu] tar de plein plein de fichiers

À la va-vite, as-tu essayé (et surtout, est-ce que ça résout ton problème) :
find . -type f -mtime 0 | xargs tar rf mon_archive_$(date +%m%d).tar


http://doc.ubuntu-fr.org/aptitude
http://bepo.fr
Pensez à chercher sur un moteur de recherche avant de demander http://google.fr/ ;)

Hors ligne

#3 Le 09/06/2010, à 07:00

credenhill

Re : [Résolu] tar de plein plein de fichiers

hello
et avec

tar -cf ../mon_archive_$(date +%m%d).tar $(find . -type f -mtime 0)

l'archive est dans .. pour ne pas se tarer elle même

Hors ligne

#4 Le 09/06/2010, à 08:03

Postmortem

Re : [Résolu] tar de plein plein de fichiers

Bonjour !
@ sensini : je vais essayer tout à l'heure mais vu que l'archive n'existe pas, je risque d'avoir le message d'erreur me disant que l'archive n'existe pas.
@credenhill : pareil, je vais essayer mais j'ai bien peur que le $(find . -type f -mtime 0) se développe en une liste bien trop longue...
On verra bien, je vous dirai ce qu'il en est.
Merci bien en tout cas !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#5 Le 09/06/2010, à 08:17

credenhill

Re : [Résolu] tar de plein plein de fichiers

Postmortem a écrit :

mais vu que l'archive n'existe pas, je risque d'avoir le message d'erreur me disant que l'archive n'existe pas.

créer une archive vide avant : touch mon_archive_$(date +%m%d).tar ; find ...

Hors ligne

#6 Le 09/06/2010, à 09:05

Totor

Re : [Résolu] tar de plein plein de fichiers

Utilise l'option u (mise à jour) plutôt que r (ajout) :

find . -type f -mtime 0 -exec tar uf mon_archive_$(date +%m%d).tar {} +

cela dit, si le nombre de fichier est vraiment conséquent, tu risques d'avoir un problème de taille du buffer de ligne de commande. Donc utilise de préférence \; plutôt que + pour le -exec


-- Lucid Lynx --

Hors ligne

#7 Le 09/06/2010, à 11:43

Postmortem

Re : [Résolu] tar de plein plein de fichiers

@ sensini et credenhill :

$ find . -type f -mtime 2 | xargs tar rf ../mon_archive_$(date +%m%d).tar
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.

$ touch ../mon_archive_$(date +%m%d).tar ; find . -type f -mtime 2 | xargs tar rf ../mon_archive_$(date +%m%d).tar
tar: tape blocksize error
tar: tape blocksize error
tar: tape blocksize error
tar: tape blocksize error

@ credenhill :

$ tar -cf ../mon_archive_$(date +%m%d).tar $(find . -type f -mtime 2)
-ksh: tar: /usr/5bin/tar: cannot execute [Argument list too long]

@ Totor :

$ find . -type f -mtime 2 -exec tar uf ../mon_archive_$(date +%m%d).tar {} +
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.

J'en suis donc arrivé à faire comme ça :

FIC1=$(find . -type f -mtime 2 | head -1)
tar cf ../mon_archive_$(date +%m%d).tar $FIC1
find . -type f -mtime 2 -exec tar uf ../mon_archive_$(date +%m%d).tar {} +

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 09/06/2010, à 11:44

Postmortem

Re : [Résolu] tar de plein plein de fichiers

J'oubliais, merci à tous pour votre aide !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 09/06/2010, à 13:20

Totor

Re : [Résolu] tar de plein plein de fichiers

Postmortem a écrit :

[...]

$ tar -cf ../mon_archive_$(date +%m%d).tar $(find . -type f -mtime 2)
-ksh: tar: /usr/5bin/tar: cannot execute [Argument list too long]

@ Totor :

$ find . -type f -mtime 2 -exec tar uf ../mon_archive_$(date +%m%d).tar {} +
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.
tar: cannot open ../mon_archive_0609.tar.

[...]

Ma première réaction fut : yikes hmm
j'ai donc vérifié et je n'ai pas eu de problème.

Ma seconde réaction fut :
"ah bah ouais mais s'il ne dit pas pas tout, c'est sûr que je ne peux pas lui donner une solution adaptée ! hmm "
en effet, tu utilises Korn shell, tu es probablement sur du Solaris, HP-UX ou autre... donc la version de tar est loin d'être la même que sous ubuntu !!!


-- Lucid Lynx --

Hors ligne

#10 Le 09/06/2010, à 15:17

Postmortem

Re : [Résolu] tar de plein plein de fichiers

Il est vrai que je ne suis pas sous Ubuntu mais je suis bien sous un Linux (SLES 10).

Après, je vous ai posté le résultat alors que j'étais en ksh... C'est la norme ici (chez le client où je bosse), nos scripts doivent être en ksh. Mais après essai en bash, mêmes problèmes !!

En fait, le souci ne venait pas du fait d'être en bash ou ksh... Ça vient du tar que j'utilisais en lui-même.
Que ce soit en bash ou ksh, si je fait "type tar" j'obtiens : tar is /usr/5bin/tar (sous bash) et tar is a tracked alias for /usr/5bin/tar (sous ksh)

Après essai, la commande que Totor a donnée plus haut fonctionne très bien (find . -type f -mtime 0 -exec tar uf mon_archive_$(date +%m%d).tar {} +) sauf que chez mon client, il faut que je précise d'utiliser le tar founi par défaut avec SLES 10 (/bin/tar).

Je ne sais pas d'où ils sortent les commandes qui sont dans /usr/5bin....... C'est certainement pour que tous les scripts fonctionnent sur tous les OS (on a du Sun, du HP-UX, différents Linux.....) sauf qu'ils y ont mis que des anciennes versions de commandes ! hmm
Toujours est-il que ces commandes n'acceptent pas les "options modernes" ! Et donc dans mon cas, un "tar -rf archive.tar ....." ou un "tar -uf archive.tar ....." ne fonctionne que si archive.tar existe déjà (et est bien une archive, un "touch archive.tar" ne résoud pas le pb)

Le pire, c'est que j'avais déjà eu un souci avec "leur" tar (pb pour exclure certains répertoires) et que je l'avais résolu en utilisant le /bin/tar.... J'avais oublié !!

Par contre, le coup du "Argument list too long" arrive que l'on soit en bash ou ksh et peu importe que j'utilise /bin/tar ou /usr/5bin/tar (pour rappel, j'ai plus de 11 000 fichiers et ces fichiers ont des nom à rallonge)

Désolé de vous avoir occupé pour rien !!

En résumé, la solution qui fonctionne est :

find . -type f -mtime 0 -exec tar uf mon_archive_$(date +%m%d).tar {} +

Merci à tous (et surtout à Totor qui, d'après ce que je lis sur ce forum, a souvent la bonne réponse !!)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 09/06/2010, à 15:49

Totor

Re : [Résolu] tar de plein plein de fichiers

Postmortem a écrit :

Il est vrai que je ne suis pas sous Ubuntu mais je suis bien sous un Linux (SLES 10).

Après, je vous ai posté le résultat alors que j'étais en ksh... C'est la norme ici (chez le client où je bosse), nos scripts doivent être en ksh. Mais après essai en bash, mêmes problèmes !!

En fait, le souci ne venait pas du fait d'être en bash ou ksh... Ça vient du tar que j'utilisais en lui-même.
Que ce soit en bash ou ksh, si je fait "type tar" j'obtiens : tar is /usr/5bin/tar (sous bash) et tar is a tracked alias for /usr/5bin/tar (sous ksh)

C'est bien ce que je t'ai dit : c'est le fait que tu aies montré que tu utilisais ksh qui m'a fait pensé que tu utilisais une version différente de tar (relis bien mon post).

Postmortem a écrit :

Par contre, le coup du "Argument list too long" arrive que l'on soit en bash ou ksh et peu importe que j'utilise /bin/tar ou /usr/5bin/tar (pour rappel, j'ai plus de 11 000 fichiers et ces fichiers ont des nom à rallonge)

Oui en effet, cette limitation n'est pas induite des outils employés mais du système.
Voilà ce qu'il se passe : le système réserve une zone mémoire pour les paramètres qui sont passés aux programmes. Cette zone mémoire a une taille limitée. Si la taille des options passés dépasse cette zone mémoire, le système ne peut donc passer tous les paramètres au programme. C'est dans ce cas que l'erreur apparaît.


-- Lucid Lynx --

Hors ligne

#12 Le 09/06/2010, à 16:18

Postmortem

Re : [Résolu] tar de plein plein de fichiers

Merci pour le complément d'infos !


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne