IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Compresser chaque répertoire et l'effacer


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Compresser chaque répertoire et l'effacer
    Bonjour,

    je souhaite réaliser mon 1er batch sous Linux. J'ai un répertoire avec une centaine de répertoires. Je souhaite créer un TAR pour chacun des répertoires et supprimer le répertoire en question.

    Ex :
    * Rep1
    * Rep 1-1
    * Fichier 1-1-1
    ...
    * Fichier 1-1-n
    * Rep 1-2
    * ....

    * Rep2
    * ....

    Je souhaite à la fin avoir un fichier "Rep1.zip", un fichier "Rep2.zip", ... en lançant mon fichier Batch dans le répertoire parent de Rep1, Rep2, ...

    J'espère que je suis clair.

    Voici le code que je compte tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/bin/bash
     
    liste_files=`ls`
     
    for Rep in $liste_files
    do
        if [ -d $Rep ]
        then
            echo "Répertoire $Rep en cours de traitement"
            tar cf $Rep.tar" $Rep
            rm -Rf $Rep
        fi  
    done
    Avant de la lancer, j'aimerais que vous me disiez si ça à une chance de marcher et quelles "sécurités" je peux mettre pour éviter de perdre des données (si l'instruction TAR plante, est ce que le script va continuer et donc m'effacer des répertoires non archivés ?, ... )

    Merci d'avance pour votre aide.
    Newbies de chez Newbies

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 426
    Points : 43 045
    Points
    43 045
    Par défaut
    Je suis pas un spécialiste de Bash (loin de là ) mais voila mes remarques :

    Il ne faut pas utiliser ls dans un script, NBah t'expliquera bien mieux que moi pourquoi. (je l'ai appris ici).
    regarde ce POST :
    http://www.developpez.net/forums/d10...-d-repertoire/

    Ensuite, effectivement si ton tar ne se passe pas bien, tes fichiers seront supprimés.
    En bash, Tu peux récupérer le code retour de la dernière commande avec :

    tar a une option pour vérifier la validité d'une archive.

    Un test plus efficace serait de décompresser le tar dans un dossier temporaire, de comparer son contenu avec le dossier source, et de n’exécuter la commande rm qu'en cas de test réussi. Ceci necessite cependant du temps et de l'espace disque.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par junior76 Voir le message
    je souhaite réaliser mon 1er batch sous Linux. J'ai un répertoire avec une centaine de répertoires. Je souhaite créer un TAR pour chacun des répertoires et supprimer le répertoire en question.
    Je souhaite à la fin avoir un fichier "Rep1.zip", un fichier "Rep2.zip", ... en lançant mon fichier Batch dans le répertoire parent de Rep1, Rep2, ...
    Bonjour

    Déjà une grosse erreur: Le tar de base ne compresse pas. Il ne fait que stocker les fichiers (et leurs caractéristiques). Si tu veux compresser le fichier ".tar", il te faut alors le passer par gzip (et ça donnera un ".gz" et non un ".zip")
    Ceci dit, les commandes "tar" modernes possèdent une option de compression "z" qui s'occupe de cette étape. Sauf que toi, tu ne l'as pas mise !!!

    Sinon voici ce que je ferais:

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    for rep in *
    do
    	test ! -d "$rep" && continue
     
    	echo "Répertoire $rep en cours de traitement"
    	tar cfz "$rep.tgz" "$rep" && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    done

    Script pas très différent du tien. La petite différence c'est que moi j'ai plutôt l'habitude d'éliminer ce que je ne veux pas traiter. Ca a juste l'avantage d'être plus court à écrire et de supprimer une tabulation.
    Le gros truc, c'est que je teste le retour de "tar" (comme l'a dit chrtophe mais j'utilise un raccourci syntaxique qui m'évite de regarder "$?") et, seulement en cas de réussite, j'efface le répertoire.

    Une petite variante...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    for rep in *
    do
    	test ! -d "$rep" && continue
     
    	echo "Répertoire $rep en cours de traitement"
    	tar cfz "$rep.tgz" "$rep"
    	tar tfz "$rep.tgz" 1>/dev/null && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    done
    ...où je demande à relire (de façon invisible) l'archive générée pour être sûr qu'on peut effectivement la relire.

    Un truc quand-même à garder à l'esprit: toujours penser à encapsuler les variables contenant des chaines par des guillemets. Ca évite les soucis surtout si la chaine (ici un nom de dossier) contient des espaces...


    Citation Envoyé par chrtophe Voir le message
    tar a une option pour vérifier la validité d'une archive.
    Là je ne vois pas trop de laquelle il s'agit. A moins que tu ne parles de l'option "t" mais dans ce cas, elle est plus là pour "lister" l'archive que pour vérifier sa validité (même si faire l'un permet alors d'en déduire l'autre).

    Citation Envoyé par chrtophe Voir le message
    Un test plus efficace serait de décompresser le tar dans un dossier temporaire, de comparer son contenu avec le dossier source, et de n’exécuter la commande rm qu'en cas de test réussi. Ceci necessite cependant du temps et de l'espace disque.
    Dans l'absolu tu as tout à fait raison, c'est la parade absolue. Maintenant ça dépend quand-même de la criticité du truc et du rapport "risque/temps de développement/temps d'exécution"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 426
    Points : 43 045
    Points
    43 045
    Par défaut
    ah, oui "&&"

    Mais comme précisé, je suis pas un spécialiste.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Déjà une grosse erreur: Le tar de base ne compresse pas. Il ne fait que stocker les fichiers (et leurs caractéristiques). Si tu veux compresser le fichier ".tar", il te faut alors le passer par gzip (et ça donnera un ".gz" et non un ".zip")
    Ceci dit, les commandes "tar" modernes possèdent une option de compression "z" qui s'occupe de cette étape. Sauf que toi, tu ne l'as pas mise !!!
    Très bonne remarque -> je me suis relu et je n'ai pas été très juste dans le descriptif de mon besoin. Comme ces dossiers comportent de nombreuses photos en JPEG, je ne pense pas gagner beaucoup en compressant (par contre, ça va ajouter un long temps de traitement, non ?).

    De plus, je compte accéder à ces archives en les montant pour pouvoir les consulter, effacer des fichiers, renommer des fichiers, ... -> je pense (peut-être à tord) qu'une version non compressée sera bien plus réactive qu'une version compressée. Qu'en penses-tu ?

    Citation Envoyé par Sve@r Voir le message
    Une petite variante...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    for rep in *
    do
    	test ! -d "$rep" && continue
     
    	echo "Répertoire $rep en cours de traitement"
    	tar cfz "$rep.tgz" "$rep"
    	tar tfz "$rep.tgz" 1>/dev/null && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    done
    J'adore ton code, j'ai mis en peu de temps à comprendre toutes les fonctions mais maintenant, c'est clair (et effectivement plus court que mon code).
    Newbies de chez Newbies

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 426
    Points : 43 045
    Points
    43 045
    Par défaut
    Quel est l’intérêt de faire des tar sur des dossiers sur lesquels tu veux faire des modifications ? même si il est possible d’ajouter/supprimer des fichiers à un .tar.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Quel est l’intérêt de faire des tar sur des dossiers sur lesquels tu veux faire des modifications ? même si il est possible d’ajouter/supprimer des fichiers à un .tar.
    En tout, j'ai 400 000 fichiers -> A chaque synchro via LuckyBackup (RSync), ça prends une plombe juste pour lister les différences. Je ne travaillerai pas tous les jours sur ces TAR mais je souhaite pouvoir, quand j'ai un peu de temps faire tu tries sur un répertoire (TAR). Maintenant, je suis ouvert à toute suggestion.

    De plus, je viens de tester, la compression me fait gagner 1% d'espace disque (dans mon exemple, je passe de 96Mo avec compression à 97Mo sans). Par contre, le temps d'archivage est presque instantanée sans compression ce qui n'était pas le cas avec la compression activée.
    Newbies de chez Newbies

  8. #8
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 426
    Points : 43 045
    Points
    43 045
    Par défaut
    Le problème est que tu devras avant chaque modification désarchiver, effectuer les modifs, réarchiver, puis recopier la nouvelle version du .tar.

    Tu peux gagner du temps en excluant les dossiers non modifiés dans ta commande rsync ou ton soft de sauvegarde (ou inversement ne prendre que certains dossiers). Ce sera à mon avis plus pratique et efficace.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Bonjour,

    Concernant l'archivage via tar, tu peux si la compression n'est pas utilisée, mettre à jour une archive en supprimant,rajoutant,remplaçant par une version plus récentes des fichiers,...
    Par contre si ton archive est compressée, il faut au préalable la décompresser et d'ailleurs, rien n'empêche de la compresser après coup et non en même temps que l'archivage.

    Sinon, si on revient sur l'idée de chrtophe de vérifier si l'archivage est correcte, on peut le faire sans prendre necessairement de la place disque, juste du temps. Voici un exemple ( simpliste ici mais fonctionnel ) :
    Création de l'archive qui servira d'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ tar czf develop.tgz develop
    $ tar tzf develop.tgz 
    develop/
    develop/script.ksh
    develop/config
    develop/input
    develop/output
    Maintenant, checkons la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c
    develop/script.ksh: Réussi
    develop/config: Réussi
    develop/input: Réussi
    develop/output: Réussi
    $ echo $?
    0
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --quiet
    $ echo $?
    0
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --status
    $ echo $?
    0
    Modifions un des fichiers pour que le checksum soit faux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "##" >>develop/script.ksh
    Maintenant, faisons de nouveau les checks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c
    develop/script.ksh: Échec
    develop/config: Réussi
    develop/input: Réussi
    develop/output: Réussi
    md5sum: Attention*: la somme de contrôle 1 ne correspond pas
    $ echo $?
    1
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --quiet
    develop/script.ksh: Échec
    md5sum: Attention*: la somme de contrôle 1 ne correspond pas
    $ echo $?
    1
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --status
    $ echo $?
    1
    Bien sur, ici, je montre 3 versions du check avec un degré de verbosité différent à choisir selon le besoin.
    Cordialement.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par junior76 Voir le message
    Comme ces dossiers comportent de nombreuses photos en JPEG, je ne pense pas gagner beaucoup en compressant (par contre, ça va ajouter un long temps de traitement, non ?).
    Tout à fait exact. Compresser un truc qui est déjà dans un format compressé...

    Citation Envoyé par junior76 Voir le message
    De plus, je compte accéder à ces archives en les montant pour pouvoir les consulter, effacer des fichiers, renommer des fichiers, ... -> je pense (peut-être à tord) qu'une version non compressée sera bien plus réactive qu'une version compressée. Qu'en penses-tu ?
    On ne peut pas "monter" un ".tar" (comme on peut le faire avec par exemple un ".iso"). Faut bien savoir que "tar" signifie "Tape ARchive" (archivage sur bande). C'est un outil destiné à l'origine à sauvegarder les fichiers sur bandes magnétiques (d'où le "facteur de blocage" qui est encore présent aujourd'hui même si son utilité devient obsolète). Et une bande magnétique n'est pas vraiment un "support adressable"...
    De plus, même les "iso" montés comme disques ne sont pas modifiables "à chaud".

    Citation Envoyé par disedorgue Voir le message
    Maintenant, checkons la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ tar xvz --to-command=md5sum -f develop.tgz | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c
    Joli, je ne connaissais pas le "--to-command"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    On ne peut pas "monter" un ".tar" (comme on peut le faire avec par exemple un ".iso"). Faut bien savoir que "tar" signifie "Tape ARchive" (archivage sur bande). C'est un outil destiné à l'origine à sauvegarder les fichiers sur bandes magnétiques (d'où le "facteur de blocage" qui est encore présent aujourd'hui même si son utilité devient obsolète). Et une bande magnétique n'est pas vraiment un "support adressable"...
    De plus, même les "iso" montés comme disques ne sont pas modifiables "à chaud".
    C'est juste, j'ai fait le test en TAR et effectivement, je ne peut le modifier (je pensais au début quer c'était un problème de paramètrage lors du montage (type RW ou autre).

    Donc, tu me confirmes qu'il n'existe aucun format d'archive ou compression (TAr, ZIP, ISO, ...) que l'on peut monter et sur lequel je pourrais travailler à chaud (renommer, effacer des fichiers) ?
    Newbies de chez Newbies

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Sinon, si on revient sur l'idée de Christophe de vérifier si l'archivage est correcte, on peut le faire sans prendre nécessairement de la place disque, juste du temps.
    Merci pour l'info.

    Donc, si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	tar tfz "$rep.tgz" 1>/dev/null && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    par ça dans mon script, c'est bon (et je n'ai pas besoin d'avoir de l'espace disque pour "detarrer" mon TAR) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            tar xvz --to-command=md5sum -f "$rep.tgz" | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --status && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    Je ne suis pas encore très à l'aise avec les | || et && (ordre de priorité, ...).
    Newbies de chez Newbies

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par junior76 Voir le message
    Donc, tu me confirmes qu'il n'existe aucun format d'archive ou compression (TAr, ZIP, ISO, ...) que l'on peut monter et sur lequel je pourrais travailler à chaud (renommer, effacer des fichiers) ?
    En fait, en cherchant un peu, il existe des solutions pour monter un fichier tar, voir par exemple AVFS, tarfs, archivemount et GVfs.

    Certains permettent d'aller plus loin que la lecture seule et autorisent la modification ou l'effacement de fichiers.
    ɹǝsn *sıɹɐlos*

  14. #14
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Citation Envoyé par junior76 Voir le message
    Merci pour l'info.

    Donc, si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	tar tfz "$rep.tgz" 1>/dev/null && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    par ça dans mon script, c'est bon (et je n'ai pas besoin d'avoir de l'espace disque pour "detarrer" mon TAR) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            tar xvz --to-command=md5sum -f "$rep.tgz" | awk '/\/$/{next};{ff=$1;getline;print $1" "ff}' | md5sum -c --status && rm -rf "$rep" || echo "Archivage $rep échoué !!!"
    Je ne suis pas encore très à l'aise avec les | || et && (ordre de priorité, ...).
    Oui, mais comme je le disais, ça prend juste du temps (qui sera plus long que la commande que cela remplace).
    Par contre, juste pour revenir sur les || :
    Dans les 2 commandes (celle d'origine ou celle qui la remplace), le || echo "Arch...." sera exécuté aussi si c'est le rm -rf "$rep" qui sort en erreur.
    Cordialement.

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 677
    Points : 30 965
    Points
    30 965
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par junior76 Voir le message
    Je ne suis pas encore très à l'aise avec les | || et && (ordre de priorité, ...).
    Il n'y a pas de priorité ; c'est du séquentiel. La suite cmd1 && cmd2 || cmd3 sera évaluée de la gauche vers la droite. Si cmd1 réussi, alors cmd2 sera effectuée. Et sa réussite (qu'on voudrait implicite) fera que cmd3 ne sera pas exécutée.
    Et si cmd1 échoue alors cmd2 ne sera pas effectuée mais comme la ligne continuera a être évaluée (avec un statut en erreur provenant de "cmd1") cmd3 sera alors exécutée.
    Mais malheureusement ce mécanisme a un prix: comme le dit disedorgue, si cmd1 réussi mais que cmd2 échoue, alors il y aura là aussi un statut en erreur ce qui fera que cmd3 sera alors aussi exécutée. Donc en général on essaye de ne pas écrire de commande intermédiaire pouvant échouer (ce qui n'est pas le cas de mon exemple car le "rm", même avec l'option "r" et "f", peut échouer si par exemple le dossier "$rep" n'a pas les droits suffisants pour que tu puisses effacer son contenu).

    On peut toutefois tricher avec ce mécanisme en forçant cmd2 à être correcte. Exemple tar tfz "$rep.tgz" 1>/dev/null && (rm -rf "$rep"; true) || echo "Archivage $rep échoué !!!". La commande "true" étant toujours vraie, même si le "rm" échoue cela n'interfère pas avec la fin.

    Sinon rien ne t'interdit de réécrire ça de façon plus classique ; ce qui permet alors d'affiner un peu plus...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if tar tfz "$rep.tgz" 1>/dev/null; then
    	rm -rf "$rep" 2>/dev/null || echo "Impossible d'effacer $rep"
    else
    	echo "Archivage $rep échoué !!!"
    fi


    PS: tu auras remarqué le if tar.... Ben oui, en shell on peut évaluer n'importe quelle commande pourvu que celle-ci renvoie un statut. Donc un "if" ne se limite pas à la commande "test"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  16. #16
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Ce n'est pas très élégant, mais si on tient absolument à conserver les && et ||, on s'en sortir comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd1 && { cmd2; true ; } || cmd3
    ɹǝsn *sıɹɐlos*

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    En fait, en cherchant un peu, il existe des solutions pour monter un fichier tar, voir par exemple AVFS, tarfs, archivemount et GVfs.

    Certains permettent d'aller plus loin que la lecture seule et autorisent la modification ou l'effacement de fichiers.
    On peut aussi ouvrir un .tar ou un .tgz avec emacs...

  18. #18
    Membre chevronné
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 036
    Points : 1 917
    Points
    1 917
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    En fait, en cherchant un peu, il existe des solutions pour monter un fichier tar, voir par exemple AVFS, tarfs, archivemount et GVfs.
    .
    Je découvres ces solutions intéressantes Je comptes en apprendre un peu plus.
    Sinon je m'apprêtais à lui proposer de compresser avec mksquashfs. C'est en lecture bien sûr au montage, mais avec une combinaison d'union avec aufs, il peut écrire olà dessus et compresser à nouveau sans avoir vraiment décompresser l'archive source. Cet article des trucs : La magie des filesystems
    Ousmane


    Quand on tombe dans l'eau, la pluie ne fait plus peur.

  19. #19
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 273
    Points : 12 708
    Points
    12 708
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if tar tfz "$rep.tgz" 1>/dev/null; then
    	rm -rf "$rep" 2>/dev/null || echo "Impossible d'effacer $rep"
    else
    	echo "Archivage $rep échoué !!!"
    fi
    Je pense qu'il y a une typo ici, tar tfz, en principe ne fonctionne pas, car c'est le connecteur f qui prend un paramètre...
    Sinon, en continuant sur la syntaxe de jlliagre, le code ci-dessus donnerait quelque chose du genre (en bash ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar tzf "$rep.tgz" 1>/dev/null && { rm -rf "$rep" 2>/dev/null || echo "Impossible d'effacer $rep" ; : ; } || echo "Archivage $rep échoué !!!"
    Cordialement.

  20. #20
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Je pense qu'il y a une typo ici, tar tfz, en principe ne fonctionne pas, car c'est le connecteur f qui prend un paramètre...
    En fait si, cette commande fonctionne correctement malgré cette syntaxe même si elle n'est pas explicitement autorisée par la documentation.

    La commande tar ne respecte pas l'usage traditionnel des options et arguments. Le premier argument de tar est une combinaison de lettres indiquant les options à utiliser. Si la lettre f est présente, le deuxième argument représente le nom du fichier archive à utiliser. L'ordre des lettres dans le premier argument n'est pas significatif. Le premier argument n'est à l'origine pas précédé d'un tiret, comme les commandes habituelles.

    Comme beaucoup d'utilisateurs mettaient quand même un tiret, les implémentations de tar ont fini par l'accepter comme premier caractère optionnel du premier argument.

    L'implémentation traditionnelle (Unix) de tar n'a pas modifié pour autant sa tolérance avec l'ordre indifférent des lettres mais l'implémentation GNU de tar traite différemment ce cas. En conséquence:

    1: Est accepté quelle que soit l'implémentation de tar:

    2: Ne fonctionne pas avec GNU tar et busybox tar, mais est OK avec Unix tar:

    3: Fonctionne avec GNU tar mais provoque une erreur avec Unix tar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tar -t -v -f file.tar
    tar -f file.tar -tv
    La lettre "z" (compression avec gzip) est une extension GNU. Elle n'est pas toujours acceptée par les autres implémentations de tar.

    Voir http://xkcd.com/1168/
    ɹǝsn *sıɹɐlos*

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Compresser chaque sous-répertoires en archive.
    Par Sivenruot dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/08/2014, 21h31
  2. [Zip] Compression de répertoires
    Par LeXo dans le forum Bibliothèques et frameworks
    Réponses: 16
    Dernier message: 22/08/2007, 15h30
  3. Compression de répertoire
    Par pi100 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/07/2007, 16h32
  4. zlib compression de répertoires
    Par pada51 dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 26/06/2007, 09h30
  5. [VBS] Compresser un répertoire ou un fichier en vbs
    Par Edoxituz dans le forum VBScript
    Réponses: 2
    Dernier message: 28/02/2006, 11h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo