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 :

Copier des fichiers en conservant leur chemin


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Par défaut Copier des fichiers en conservant leur chemin
    Bonjour,

    Je voudrais copier une série de ficher sélectionnés par un filtre dans un répertoire cible, tout en conservant leur chemin. Quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find -iname "*Copie*" -exec mv '{}' ~/backup/
    Le problème avec cette commande, c'est que si j'ai deux fichiers du même nom dans un dossier différent, j'obtiens un conflit. Par exemple si ma source est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~/bureau/doss1/fichier
    ~/bureau/doss1/fichierCopie
    ~/bureau/doss2/fichier
    ~/bureau/doss2/fichierCopie
    Je voudrais obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~/bureau/doss1/fichier
    ~/bureau/doss2/fichier
    ~/backup/doss1/fichierCopie
    ~/backup/doss2/fichierCopie
    Merci de votre aide,
    Thibaud.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    je ne me souviens pas que find puisse faire de telles choses tout seul.
    -printf peut manipuler les données affichées, mais -exec n'en tient pas compte.

    regarde ici
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Perso, pour ce genre de traitements, je fais un script intermédiaire que j'appelle dans la commande find :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/bash
     
    # récupération des arguments :
    # 1. fichier à déplacer
    # 2. dossier de destination
    cur_file=$1
    target_dir=$2
    # suppression du './' généré par find
    sub_path=${cur_file:2}
    # concaténation avec le répertoire cible
    target_file=$target_dir/$sub_path
    # move
    mv $cur_file $target_file
    Du coup la commande deviendrait : find . -iname "*Copie*" -exec /path/to/script.sh '{}' "~/backup/" \;.

    Ici le script tient compte du fait que la commande find est lancée en relatif à la racine du répertoire à "copier", si ce n'est pas le cas il faut lui apporter quelques modifs (et il serait beaucoup plus complexe).

    PS:
    A l'attention des experts qui lisent ce forum: je ne suis pas un guru linux. Si mon script n'est pas "joli", merci de le dire, de dire en quoi et surtout pourquoi au lieu de moinser.
    C'est le genre de script que je fais pour moi et qui marche, après il est certainement améliorable, il est sûrement truffé de failles de sécurités et il manque très probablement de contrôles.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 80
    Par défaut
    Merci à tous les 3. Le problème est qu'il faudrait un mkdir pour recréer chacun des sous répertoire à déplacer de façon récursive non ? Il me semblait pourtant que mv, cp ou find avait un argument qui permettait de recréer le chemin tout en faisant un filtre ; j'ai même fait ça il y a quelques temps mais je ne parviens pas à me souvenir comment, et je ne vois pas quel serait l'argument dans les man...

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Dans le script que j'ai donné, avant le mv tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    target_path=$(dirname $target_file)
    if [ "$target_path" != "." -a ! -e "$target_path" ]
    then
      mkdir -p "$target_path"
    fi
    qui crée l'arborescence si le répertoire n'existe pas et est différent de '.'.

  6. #6
    Membre éprouvé
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Par défaut find tar
    je proposerais bien une combinaison avec la commande find pour lister tes fichiers, pipé avec un tar pour tarer dans la sortie standard, pipé avec un tar pour detarer dans ton arborescence....

  7. #7
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par thibaud74 Voir le message
    Bonjour,

    Je voudrais copier une série de ficher sélectionnés par un filtre dans un répertoire cible, tout en conservant leur chemin. Quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find -iname "*Copie*" -exec mv '{}' ~/backup/
    Le problème avec cette commande, c'est que si j'ai deux fichiers du même nom dans un dossier différent, j'obtiens un conflit. Par exemple si ma source est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~/bureau/doss1/fichier
    ~/bureau/doss1/fichierCopie
    ~/bureau/doss2/fichier
    ~/bureau/doss2/fichierCopie
    Je voudrais obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~/bureau/doss1/fichier
    ~/bureau/doss2/fichier
    ~/backup/doss1/fichierCopie
    ~/backup/doss2/fichierCopie
    Merci de votre aide,
    Thibaud.
    c'est pour ça qu'il faut tjrs horodater les fichiers DESTINATION pour distinguer
    genre ~/backup/toto.2012112708183010

    ça empêche ce genre de problèmes. voir utiliser le pid de la commande cp si c'est une boucle par itération en plus de la date pour différentier encore plus.
    exemple ~/backup/toto.17234.2012112708183010
    ce qui évite que l'action trop rapide utiliser la meme seconde+dizième (ici 3010)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/11/2010, 23h35
  2. Réponses: 1
    Dernier message: 19/05/2010, 10h30
  3. Copier des fichiers sur une clé USB, problème pour le chemin.
    Par monsieurY dans le forum Scripts/Batch
    Réponses: 21
    Dernier message: 21/01/2010, 09h56
  4. Réponses: 6
    Dernier message: 15/10/2009, 12h14
  5. Batch pour copier des fichier
    Par borgfabr dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/03/2004, 07h55

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