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 :

Equivalent à XCOPY du DOS


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien d'étude
    Inscrit en
    Septembre 2007
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien d'étude

    Informations forums :
    Inscription : Septembre 2007
    Messages : 56
    Par défaut Equivalent à XCOPY du DOS
    Bonjour à tous et à toutes,

    j'ai un petit souci pour trouver l’équivalent à une ligne de commande "xcopy" en DOS.

    Mon but est de copier tous les "PDF" d'une arborescence source à une arborescence destination et d'exclure par la même tous les autres types de fichiers de la copie.

    J'ai initialement pensé à la commande "cp" mais je n'arrivais pas à ne selectionner qu'un seul type de fichiers.

    Je me suis donc orienté vers la commande "rsync", en pensant trouver mon bonheur avec --include et --exclude avec "--include='*.pdf' --exclude='*'". Je pensais qu'il y ait un ordre de priorité, genre si l'include est satisfait, rsync saute l'exclude qui suit mais apparemment c'est pas le cas

    J'arrive a un truc un peu sympa en utilisant --exclude-from mais ça m'oblige à mettre dans une liste d'exclusion TOUTES les extensions non désirées, en minuscule et en majuscule, ce qui peut s'avérer assez laborieux.

    J'ai aussi trouvé, sur Internet, une ligne de commande combinant 'find' et 'cp' mais dans ce cas, je ne retrouve pas mon arborescence dans la destination.

    Bref, c'est un peu en désespoir de cause que je m'adresse à vous.

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

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Par défaut
    je te propose ceci,
    il faut que REP_CIBLE existe mais sans forcement posséder la sous arborescence de REP_SOURCE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd REP_SOURCE
    tar cvf - $(find . -name '*.pdf') | ( cd REP_CIBLE ; tar xvf -)
    Edit :

    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd REP_SOURCE
    find . -name '*.txt' | xargs tar cvf - | ( cd REP_CIBLE ; tar xvf -)

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd REP_SOURCE
    cp -R -d --parents -v {./,**}/*.pdf /chemin/REP_DEST


    Édit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cd REP_SOURCE
    shopt -s globstar
    cp -R -d --parents -v **/*.pdf /chemin/REP_DEST

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tar cvf - $(find REP_SOURCE/ -name '*.pdf') | ( cd REP_CIBLE ; tar xvf -)

    J'aime bien la méthode de brute à l'arrach-style.... efficace mais au combien geekounette la méthode...

    de façon plus traditionnelle, la méthode de zipe31 est plus logique

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

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Par défaut
    Citation Envoyé par frp31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tar cvf - $(find REP_SOURCE/ -name '*.pdf') | ( cd REP_CIBLE ; tar xvf -)

    Attention !
    Ta manière de corriger mon script est incorrecte : tu as mis REP_SOURCE/ en argument de find, ce qui fait que le TAR va contenir le chemin absolu des fichiers et par conséquence, l'extraction va ecraser ces même fichiers au lieu de creer une nouvelle version à la cible.

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

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd REP_SOURCE
    cp -R -d --parents -v {./,**}/*.pdf /chemin/REP_DEST

    je n'arrive pas à comprendre ce que fait {./,**} ?
    pouvez vous m'éclairez?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    je n'arrive pas à comprendre ce que fait {./,**} ?
    pouvez vous m'éclairez?
    Arf, comme un âne dernièrement j'avais désactivé l'option "globstar" et de ce fait je ne comprenais pas pourquoi ce matin un simple cp -R -d --parents -v **/*.pdf /chemin/REP_DEST ne marchait pas

    Donc merci déjà et de ce fait ça marche sans employer de moulinettes

    Donc pour traduire mon expression, ça me permettait sans l'option shopt -s globstar d'activée de chercher à la fois dans le répertoire courant et dans les sous-répertoires

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Voici un script qui ne modifie pas tes options: solution.bash

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    original=$1
    destination=$2
     
    while read ligne
    do 
    	nouveau_dossier="$destination$( sed 's@^[^\/]*@@;s@[^\/]*$@@' <<<$ligne )"
    	mkdir -p "$nouveau_dossier"
    	cp "$ligne" "$nouveau_dossier"
    done < <( find "$original" -type f -iname "*.pdf" )
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ./solution.bash original clone

  9. #9
    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 qqcvd Voir le message
    Attention !
    Ta manière de corriger mon script est incorrecte : tu as mis REP_SOURCE/ en argument de find, ce qui fait que le TAR va contenir le chemin absolu des fichiers et par conséquence, l'extraction va ecraser ces même fichiers au lieu de creer une nouvelle version à la cible.
    oui effectivement j'y ai pas pensé quand j'ai recopié le texte je voulais m'éviter de retapper les deux lignes

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar cvf - $(find REP_SOURCE/ -name '*.pdf') | ( cd REP_CIBLE ; tar xvf -)
    Attention !
    Ta manière de corriger mon script est incorrecte : tu as mis REP_SOURCE/ en argument de find, ce qui fait que le TAR va contenir le chemin absolu des fichiers et par conséquence, l'extraction va ecraser ces même fichiers au lieu de creer une nouvelle version à la cible.
    Salut
    Depuis plusieurs années, le tar supprime le "/" initial dans les fichiers qu'il archive (sauf si expressément demandé via l'option "-P").

    Donc cela créera un dossier nommé "REP_SOURCE" sous "REP_CIBLE" sans toucher au dossier "REP_SOURCE" initial.

    Toutefois, il est très important de rajouter l'option "p" dans la restauration pour que les fichiers copiés récupèrent les droits (le mode) des fichiers initiaux. Sinon ils seront créés avec les droits du umask (je ne comprends d'ailleurs pas pourquoi ce n'est pas automatique tellement c'est plus naturel d'avoir des fichiers restaurés avec les droits d'origine mais bon...)
    Et personnellement je trouve le "v" de la copie plutôt inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tar cf - $(find REP_SOURCE/ -name '*.pdf') | ( cd REP_CIBLE ; tar xpvf -)
    Sinon il y a plus simple avec cpio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find REP_SOURCE -name '*.pdf' | cpio -pvd REP_CIBLE
    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
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par Aenean Voir le message
    Je me suis donc orienté vers la commande "rsync", en pensant trouver mon bonheur avec --include et --exclude avec "--include='*.pdf' --exclude='*'". Je pensais qu'il y ait un ordre de priorité, genre si l'include est satisfait, rsync saute l'exclude qui suit mais apparemment c'est pas le cas
    Le problème avec '--exclude "*"' c'est qu'on exclut tout et surtout la racine du répertoire source, il faut donc préciser dans "--include" la racine de son répertoire source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rsync -av -m --include "*/" --include "*.pdf" --exclude "*" REP_SOURCE/  REP_CIBLE
    Attention aussi au slash final dans "REP_SOURCE/". Avec le répertoire source n'est pas repris dans l'arborescence du répertoire cible...


Discussions similaires

  1. Problème avec Xcopy sous Dos sous XP
    Par jackinthebox dans le forum Windows XP
    Réponses: 2
    Dernier message: 20/10/2012, 23h23
  2. Equivalent chmod en dos
    Par coincoin22 dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 31/07/2007, 16h54
  3. Xcopy et Dos sous XP
    Par dede0361 dans le forum Windows XP
    Réponses: 20
    Dernier message: 15/07/2007, 22h47
  4. [aide]equivalent a "if exist" (dos) en C...
    Par S2S dans le forum Windows
    Réponses: 5
    Dernier message: 04/05/2006, 14h20
  5. [DOS] la commande xcopy
    Par OverCat dans le forum Scripts/Batch
    Réponses: 19
    Dernier message: 01/03/2006, 11h44

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