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 :

Déplacer des sous-répertoires et leur contenu


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut Déplacer des sous-répertoires et leur contenu
    Bonjour,
    Je cherche à compresser et archiver des répertoires et leur contenu.
    En prenant pour hypotèse que ces répertoires sont dans $REPERTOIRE, je veux archiver les fichiers qui se trouvent dans les sous-répertoires de $REPERTOIRE, puis déplacer ces sous-répertoires dans un répertoire d'archives $REPARCHIV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             find $REPERTOIRE"/" -mindepth 1 -mtime +2 -print -exec gzip -r {} \;
             find $REPERTOIRE"/" -mindepth 1 -mtime +2 -print -exec cp -rf {} $REPARCHIV \;
             find $REPERTOIRE"/" -mindepth 1 -mtime +2 -print -exec rm -rf {} \;
    Ce code zippe bien les fichiers et les déplace mais sans les répertoires qui les contiennent.
    Si j'enlève le mindepth, tout est dépacé même le répertoire racine $REPERTOIRE.

    Une idée?
    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    c'est une contrainte gzip ? ce serait plus évident avec tar.
    STFW...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Oui, ils sont en tar quand ils sont plus anciens.
    Dans un premier temps, il faut juste que je les zippe.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    sauf qu'en l'état avec tar il risque surtout de se retrouver avec tout un tas d'archives qui contiennent les mêmes données
    je pense qu'en priorité il conviendrait d'affiner le find parce que le résultat est assez hasardeux là...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rep1                  # gzip recursif
    rep1/fichier1         # puis un autre gzip sur ce fichier qui n'existe plus ? (qui a été gzippé au tour précédent en fait)
    rep1/fichier2         # idem
    rep1/rep2             # même topo
    rep1/rep2/fichier1    # ...

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    je propose ce truc là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    find "$REPERTOIRE/" -type d -mindepth 1 -mtime +2 |   # on récupère les répertoires concernés
    sort -ru |                                            # on les trie vite fait
    while read i; do                                      # pour chacun de ces répertoires
       mkdir -p "$REPARCHIV/$i" &&                        # on recrée son arborescence dans le répertoire d'archivage
       find "$i/" -maxdepth 1 -type f |                   # puis pour chaque fichier qu'il contient
       while read j; do
          gzip -q "$j" &&                                 # on gzip le fichier
          mv "${j}.gz" "$REPARCHIV/${i}/"                 # et on le déplace dans l'arborescence correspondante
       done
       rmdir "$i/" 2>/dev/null                            # à la fin on tente de virer le répertoire, s'il est vide
    done
    y'a peut-être plus simple/plus évident mais ça me saute pas aux yeux pour l'instant...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par N_BaH
    ce serait plus évident avec tar.
    Citation Envoyé par BufferBob
    sauf qu'en l'état avec tar il risque surtout de se retrouver avec tout un tas d'archives qui contiennent les mêmes données
    mais pourquoi ?

    j'ai peut-être mal compris que Michalak veut compresser les sous-répertoires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find "$REPERTOIRE/" -type d -mindepth 1 -mtime +2 -exec sh -c 'tar -zcvf "${1}.tar.gz" "$1"; mv "${1}.tar.gz "$ARCHIVES"/' sh {} \;

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    mais pourquoi ?
    ben parce que tar est récursif par défaut et laisse les fichiers d'origine justement (c'est pour ça que son début de script faisait mine de fonctionner partiellement avec gzip), sinon sur le principe je suis d'accord que c'est probablement beaucoup plus simple et efficace à mettre en oeuvre

    à priori ici il veut déplacer les répertoires contenant les fichiers gzippés

  8. #8
    Invité
    Invité(e)
    Par défaut
    à priori ici il veut déplacer les répertoires contenant les fichiers gzippés
    ouaip, encore un exposé approximatif, qui ouvre à interprétations.
    Michalak va devoir expliquer précisément ce qu'il veut faire.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Bonjour,
    Merci pour vos commentaires.

    J'ai des répertoires qui contiennent un fichier pdf et un fichier xml de méta-données.
    Ces répertoires sont dans $REPERTOIRE dans mon exemple.

    Le but est de les déplacer dans un répertoire d'historisation après avoir compresser leur contenu.

    Merci de votre aide.

  10. #10
    Invité
    Invité(e)
    Par défaut
    pour moi, ce n'est pas encore assez précis.

    tu veux compresser chaque fichier indépendemment, ou le répertoire qui les contient ?

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Citation Envoyé par Michalak Voir le message
    J'ai des répertoires qui contiennent un fichier pdf et un fichier xml de méta-données.
    Le but est de les déplacer dans un répertoire d'historisation après avoir compresser leur contenu.
    tu veux compresser chaque fichier indépendemment, ou le répertoire qui les contient ?
    Bonjour

    De mon point de vue il a écrit "compressé leur contenu" donc pour moi ce sont les fichiers qu'il contient. Et comme les répertoires ne contiennnent que "un fichier pdf et un fichier xml de méta-données" pas la peine de tester la nature des fichiers listés.

    Vu cet énoncé je pense qu'on reste à un seul sous-niveau à partir de "$REPERTOIRE". Donc je tente un truc à partir de là...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for dir in $REPERTOIRE/*; do
        for f in $dir/*; do
            gzip -9 "$f"
        done
        mv "$dir" "rep_histo"
    done
    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]

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Bonjour,
    Je veux compresser indépendamment chaque fichier et ensuite déplacer le répertoire qui les contient.
    La solution de Sve@r fonctionne parfaitement sauf que j'ai besoin de déplacer seulement les fichiers de plus de x jours.

  13. #13
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Michalak Voir le message
    Je veux compresser indépendamment chaque fichier et ensuite déplacer le répertoire qui les contient.
    La solution de Sve@r fonctionne parfaitement sauf que j'ai besoin de déplacer seulement les fichiers de plus de x jours.
    Ce n'est pas possible. Quand tu déplaces un répertoire tu déplaces tous les fichiers qu'il contient. Tu ne peux pas déplacer un répertoire en ne déplaçant que les fichiers de plus de x jours.

    Voici une solution qui compresse et déplace les fichiers (et non les répertoires) de plus de x jours.

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for dir in $REPERTOIRE/*; do
    	# On crée un clone du répertoire traité
    	mkdir -p "rep_histo/$(basename "$dir")"
     
    	# On cherche les fichiers de plus de x jours
    	find "$dir" -maxdepth 1 -type f -mtime +x -print |while read f; do
    		# On ne compresse que des fichiers non compressés (pour éviter la surcompression)
    		file "$f" |fgrep "gzip" 1>/dev/null || gzip -9 "$f"
     
    		# On déplace le fichier zippé
    		mv "$f.gz" "rep_histo/$(basename "$dir")"
    	done
    done
    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]

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Merci pour ce retour.
    Je teste ASAP.

    Par contre, je ne me suis pas fais comprendre.

    Tous les fichiers d'un répertoire sont horodatés de la même façon.
    Je veux compresser tous les fichiers contenus dans un répertoire s'ils sont plus vieux de plus de 7 jours par exemple, et ensuite déplacer le répertoire et les fichiers contenus.

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Michalak Voir le message
    Tous les fichiers d'un répertoire sont horodatés de la même façon.
    Ah ben oui, évidemment si tu ne nous dis pas tout...

    Citation Envoyé par Michalak Voir le message
    Je veux compresser tous les fichiers contenus dans un répertoire s'ils sont plus vieux de plus de 7 jours par exemple
    Rectification: tu veux compresser tous les fichiers contenus dans un répertoire si celui-ci en contient au-moins un plus vieux de plus de 7 jours par exemple (puisque tous sont à la même date)
    Citation Envoyé par Michalak Voir le message
    , et ensuite déplacer le répertoire et les fichiers contenus.
    Donc à mon avis le plus simple est de tester si un fichier de plus de 7 jours s'y trouve. Et si c'est le cas alors on compresse tout le dossier. Ou inversement on saute le dossier s'il ne contient pas au-moins un fichier de plus de 7 jours...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for dir in "$REPERTOIRE"/*; do
    	# On saute le dossier s'il ne contient aucun fichier de plus de 7 jours
    	test -z "$(find $dir -maxdepth 1 -type f -mtime +7 -print)" && continue
     
    	# Ici le dossier est candidat à l'archivage - On traite tous ses fichiers (qui sont, dit-il, horodatés à la même date)
    	for f in "$dir"/*; do
    		# On ne compresse que des fichiers non compressés (pour éviter la surcompression)
    		file "$f" |fgrep "gzip" 1>/dev/null || gzip -9 "$f"
    	done
     
    	# On déplace le dossier
    	mv "$dir" "rep_histo"
    done
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Bonsoir,
    Désolé si je n'ai pas été clair.
    En tout cas ta solution fonctionne nickel.
    Merci beaucoup de ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 31/01/2015, 21h04
  2. Déplacer des sous dossiers par le début de leur nom
    Par hilibili dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 25/07/2014, 15h49
  3. [XL-2003] recherche un fichier dans des sous répertoire et recopier son contenu
    Par hallscar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/12/2011, 20h30
  4. Réponses: 2
    Dernier message: 07/10/2011, 12h57
  5. Réponses: 6
    Dernier message: 25/10/2006, 21h00

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