Vous n'êtes pas identifié.
Salut les gars,
Voici un petit couac sur lequel je butte, après avoir fouiller les listes de discussions, les cours et tutoriels et tester des combinaisons de xargs et autres awk .
Voici le contexte :
find /RepertoireRacine/ -type f -mmin -$NbrsDeMinutesAnterieures | xargs tar cvf - {} | gzip > fichierDumpDesFichiersRecents.tar.gz
les sorties recrachés par xargs sont des chemins absolus de fichiers du type :
/RepertoireRacine/RepertoireSuite2/monfichierRecent.txt
/RepertoireRacine/RepertoireSuite2/monfichierRecent2.txt
/RepertoireRacine/RepertoireSuite2/monfichierRecent2.txt
ce sur quoi je me retrouves donc avec une archive contenant les fichiers récéments modifiés ainsi que leurs répertoires respectifs, donc une arborescence comme :
/RepertoireRacine/RepertoireSuite2 (quelque fichiers récents Ici par exemple)/RepertoireSuite3 (encore des fichiers)/RepertoireSuite4 etc...
ce qui est bien vu qu'on a pas tout en vrac sous un repertoire because on conserve l'arbo, sauf que je souhaiterais qu'il ne crée ces répertoires qu'à partir du niveau que je lui donne, exemple :
/RepertoireSuite3 (quelques fichiers)/RepertoireSuite4(quelques fichiers)/
donc sans /RepertoireRacine/RepertoireSuite2...
Voila voiloû, merci d'avance de vos dépannages et sans qu'il n'y ait besoin de modifier le contexte de commande si possible...
Hors ligne
Hello,
Par défaut find produit des chemins relatifs à son répertoire courant, tu peux donc faire comme cela:
cd /repertoireRacine/ ; find . -type f -mmin $minutes | tar cvzf /destination/fichiers-recents.tar.gz -T -
Ou, si le chemin absolu pour le fichier de destination de tar te dérange,
(cd /repertoireRacine/ ; find . -type f -mmin $minutes) | tar cvzf fichiers-recents.tar.gz -T - -C /repertoireRacine
Ici, les parenthèses provoquent l'utilisation d'un sous-shell, ce qui rend local le changement de répertoire. L'option -C de tar indique le répertoire de base à utiliser pour les fichiers à archiver/désarchiver.
note l'usage de l'option -z de tar pour opérer directement sur un .tar.gz.
Très important: note l'usage de l'option "-T -" pour que tar prenne sur son entrée standard la liste des fichiers. Passer par xargs est dangereux, parce que l'espace alloué pour passer les arguments est limité. Si le nombre de fichiers est important, tout ne tiendra pas sur une seule commande, et xargs va invoquer tar plusieurs fois de suite, ce qui aura pour conséquence d'écraser ton archive a chaque fois, et il te manquera une partie conséquente de ton backup. L'option -T de tar permet de contourner le problème.
Hors ligne
Comme je n'ai pas été sur d'être sufisament clair je re-précise ici :
Ma solution se définirai ainsi :
-> Pouvoir obtenir dans l'archive de sortie tous les répertoires et sous répértoires inférieurs mais en ayant le pouvoir d'amputé la partie supérieure (en sortie, et non en amont de la commande donnée plus haut) du nombre de répertoires que je souhaites.
Dans l'exemple :
/ (répertoire racine)
/rep1
/rep1/sous-rep11
/rep1/soup-rep12
/rep1/soup-rep13
/rep2
Je lance ma commande pour qu'il identifie les fichiers récements modifiés dans /rep1/ pour qu'il cherche donc aussi dans "sous-rep11, sous-rep12 et sous-rep13".
Ainsi dans l'archive de sortie crée par tar il va me reconstituer physiquement cette arborescence sur le disque dur avec :
/rep1
/rep1/sous-rep11/(fichiers)
/rep1/soup-rep12/(fichiers)
/rep1/soup-rep13/(fichiers)
MAIS je ne souhaites pas qu'il me crée physiquement le répertoire "/rep1" car je ne veux avoir dans mon archive que :
/soup-rep11/(fichiers)
/soup-rep12/(fichiers)
/soup-rep13/(fichiers)
Si j'obtiens cela, c'est j'ai donc que j'ai pû "amputé" la création de l'archive d'1 répertoire supérieur et j'ai réussi....
C'est que je veux ça sachant que pour que TAR puisse archiver chaque fichier il lui faut absolument le chemin absolu de chacun de ces fichiers, ce qui tombe bien vu que c'est ce que Find lui donne à manger, des chemins de fichiers absolus comme :
/rep1/sous-rep11/MonFichier1
/rep1/sous-rep11/MonFichier2
etc...
donc TAR pas con, il va créer dans l'archive :
/rep1/sous-rep11/ MonFichier1 et MonFichier2
mais moi j'en veux pas de son "/rep1/" dans l'archive !
Juste ca :
/sous-rep11/ MonFichier1 et MonFichier2
Voilà Voiloû, j'espère que mon besoin est mieux explicité :-) ainsi la solution se situe dans l'interaction entre "find" et "tar" que vers "find" seul.
Si seulement cette option existait avec "tar" ca serait parfait, sauf que on ne peux pas dire : "Ne crée pas les n premiers dossiers de niveau supérieurs dans l'archive"
Hors ligne
Bonjour BOFH,
JE me penche sur ce que tu disais et je reviens vers toi ;-)
Hors ligne
Hm, non, tar n'a pas besoin de noms absolus pour archiver des fichiers, les noms relatifs vont très bien.
En fait, c'est même le contraire: quand tu donnes à tar des noms de fichiers absolus, tar "ampute" le slash initial, et lors de l'extraction les chemins seront toujours interprétés par rapport au répertoire courant, parce que ce serait potentiellement dangereux d'avoir une archive dont les fichiers ne peuvent être extraits qu'a un emplacement absolu.
Hors ligne
Re Bofh;
En fait je viens de tester la commande avec tes options sans avoir tout à fait bien compris, ce qui donne ca :
find /home/bros -type f -mmin -3000 | tar cvzf ./fichierDumpFichiersRecents.tar.gz -T - -C /home/bros
Ce sur quoi il fonctionne normalement en m'insérant dans la nouvelle archive une dizaine de fichiers qu'il a rangé de cette façon :
/home/bros/ksh/fichier1.ksh
/home/bros/cfg/fichier2.ksh
mais je me retrouves donc toujours avec ce satané /home/bros...
Bros
Hors ligne
non, dans ce cas le -C ne sert à rien comme tu lui passes des fichiers absolus.
L'idée, c'est de d'abord faire un cd dans le répertoire à archiver, et faire "find ." de manière a obtenir des chemins relatifs. Comme les chemins sont relatifs, il faut soit lancer tar dans le même répertoire courant que le find (1ère option) ou utiliser -C pour lui faire changer de répertoire courant après avoir ouvert le fichier archive (c'est selon que tu as besoin de te référer au fichier archive par un chemin absolu ou pas; si le chemin est relatif, changer de répertoire courant avec la 1ere version de la commande va changer l'emplacement de ton archive).
Tu vas te retrouver avec des chemins de type "./truc/machin" dans l'archive, ce qui est équivalent à ce que tu cherches (le ./ n'a aucun effet et peut être ignoré).
Hors ligne
Re,
HA oui ca y est ca marche now ! Merci merci merci, ca implique effectivement de se placer dans le répertoire à partir duquel on veut chercher mais au moins le résultat est là ! Merci encore BOFH, je crois que je vais rameuter des inscrits sur ce forum histoire de le faire vivre encore un peu plus
See you soon,
Bros
Hors ligne