Limite du niveau d'arborescence des répertoires archivés récursivement - Shell/Batch - Programmation
Marsh Posté le 14-12-2006 à 19:52:48
Désolé, mais la question n'est pas très claire, car deux cas peuvent se présenter et je ne vois pas bien duquel il s'agit :
Imaginons l'arborescence suivante :
/ (répertoire racine)
/rep1
/rep1/sous-rep11
/rep1/soup-rep12
/rep1/soup-rep13
/rep2
...
On peut faire un find à partir de la racine, ou à partir de n'importe quel autre répertoire, et on peut indiquer un chemin absolu (qui commence avec une barre oblique) ou un chemin relatif (qui ne commence pas par une barre oblique). On peut ici faire find rep1 ....... et on aura rep1 et ses trois sous-répertoires, sans rep2.
La sélection au niveau vertical marche, mais pas au niveau horizontal. C'est-à-dire que l'on ne peut pas avec un seul find, sélectionner sous-rep12 et sous-rep13, sans sélectionner aussi sous-rep11, parce que soit on prend tout le contenu de rep1, soit tout le contenu de sous-repx, mais pas un assortissement choisi des sous-repx.
Marsh Posté le 15-12-2006 à 10:31:47
Bonjour olivthill,
Merci de ta réponse, oui j'ai bien conscience que find ne peut pas séléctionner au niveau horizontal mais quelque soit la façon de fonctionner de find je ne pense pas que la solution à ma problématique fasse participer "find", 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) du nombre de répertoires que je souhaites.
Pour reprendre ton 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é :-) et que tu vois que 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 tu peux pas dire : "Ne crée pas les n premiers dossiers de niveau supérieurs dans l'archive"
Marsh Posté le 15-12-2006 à 15:03:32
CA y est résolu, en fait il falait d'abord se rendre dans le répertoire Racine, ce qui donne :
cd /repertoireRacine/ ;
find . -type f -mmin $minutes) | tar cvzf fichiers-recents.tar.gz -T - -C /repertoireRacine
Le "find ." fesant toute la différence
Marsh Posté le 20-12-2006 à 05:33:56
bros a écrit : ...sachant que pour que TAR puisse archiver chaque fichier il lui faut absolument le chemin absolu de chacun de ces fichiers... |
Ah ? et d'où sors-tu cette certitude ???
tape donc "tar cvf /tmp/toto.tar ." ou bien "cd /etc; tar cvf /tmp/titi.tar passwd group" et tu verras s'il faut le chemin absolu...
bros a écrit : CA y est résolu, en fait il falait d'abord se rendre dans le répertoire Racine, ce qui donne : |
Tu viens de (re) découvrir la différence entre "nom relatif" et "nom absolu" et aussi l'utilité du nom "." (où beaucoup d'ahuris qui découvrent les noms "." et ".." et qui ne voient un nom de répertoire qu'associé à la commande "cd" disent << mais ça sert à quoi de faire "cd ." ??? >>...)
Ce qui m'étonne, c'est que les "tar" récents ont l'habitude de supprimer d'eux-même le "/" initial quand il y est. Ce qui fait que si tu tapes
tar cvf /tmp/toto.tar /home |
Tu verras une ligne disant à peu près ceci "removed "/" from archive" et t'auras dans "/tmp/toto.tar" des noms commençant par "home" et non "/home" (le "/" faisant toute la différence entre nom relatif et nom absolu)
Il me semble que tu es sur un système plutôt récent style Linux (la commande "xargs" n'étant pas non plus hyper vieille) donc je suis étonné que tu aies eu ce pb...
Normallement, en tapant ta commande initiale
find /RepertoireRacine/ -type f -mmin -$NbrsDeMinutesAnterieures | xargs tar cvf - {} | gzip > fichierDumpDesFichiersRecents.tar.gz |
Tu aurais dû te retrouver avec une archive contenant "RepertoireRacine/truc", "RepertoireRacine/chose" etc... et non "/RepertoireRacine/truc", "/RepertoireRacine/chose", etc...
Marsh Posté le 14-12-2006 à 18:19:18
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...