copie de fichiers

Le
miterrandir
Bonjour,

Je cherche à faire une petite bricole pour copier des fichiers contenus dans
des répertoires.

Je voudrais copier tous les fichiers images contenus dans le
répertoire /var/toto/ (ainsi que ceux contenu dans ses sous
répertoires : /var/toto/tata, /var/toto/tata/tutu) vers /var/titi. J'ai du
gif, png & jpg.

J'ai tenté de bricoler avec cp mais il copie également les répertoires et je
n'ai rien trouvé de concluant dans le man.

Je suis prenneur de toute idée.
Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
talon
Le #2054591
miterrandir
Bonjour,

Je cherche à faire une petite bricole pour copier des fichiers contenus dans
des répertoires.

Je voudrais copier tous les fichiers images contenus dans le
répertoire /var/toto/ (ainsi que ceux contenu dans ses sous
répertoires : /var/toto/tata, /var/toto/tata/tutu) vers /var/titi. J'ai du
gif, png & jpg.

J'ai tenté de bricoler avec cp mais il copie également les répertoires et je
n'ai rien trouvé de concluant dans le man.

Je suis prenneur de toute idée.
Merci d'avance.


Ceci marche mais je n'aime pas:
niobe% mkdir toto
niobe% mkdir toto/a toto/b
niobe% touch toto/a/c.jpg toto/d.png toto/b/e.gif
niobe% cp `find toto -name '*.jpg' -or -name '*.png' -or -name '*.gif'` .
niobe% rm c.jpg d.png e.gif

Apparemment utiliser -exec cp {} . ;
ne marche pas.

--

Michel TALON

Marc
Le #2054581
Michel Talon wrote:

Je voudrais copier tous les fichiers images contenus dans le
répertoire /var/toto/ (ainsi que ceux contenu dans ses sous
répertoires : /var/toto/tata, /var/toto/tata/tutu) vers /var/titi. J'ai du
gif, png & jpg.



Avec un shell qui aide (et en espérant qu'il n'y en ait pas trop) :
cp /vat/toto/**/*.(gif|png|jpg) /var/titi
Il y a de petites subtilités si on a des noms commençant par un '.'.

J'ai tenté de bricoler avec cp mais il copie également les répertoires et je
n'ai rien trouvé de concluant dans le man.

Je suis prenneur de toute idée.
Merci d'avance.


Ceci marche mais je n'aime pas:
niobe% mkdir toto
niobe% mkdir toto/a toto/b
niobe% touch toto/a/c.jpg toto/d.png toto/b/e.gif
niobe% cp `find toto -name '*.jpg' -or -name '*.png' -or -name '*.gif'` .
niobe% rm c.jpg d.png e.gif

Apparemment utiliser -exec cp {} . ;
ne marche pas.


-exec cp {} . + ne marche pas, mais la version avec ; marche. Peut-être
un oubli de parenthèses ?


Nicolas S.
Le #2096911
(Michel Talon) a écrit:

niobe% mkdir toto
niobe% mkdir toto/a toto/b


% mkdir -p toto/{a,b}

niobe% touch toto/a/c.jpg toto/d.png toto/b/e.gif


% touch toto/{a/c.jpg,d.png,b/e.gif}

niobe% cp `find toto -name '*.jpg' -or -name '*.png' -or -name
'*.gif'` . niobe% rm c.jpg d.png e.gif

Apparemment utiliser -exec cp {} . ;
ne marche pas.


% find toto ( -name '*.jpg' -o -name '*.png' -o -name '*.gif' ) -exec
cp -v '{}' . ;

On peut aussi contourner le problème des parenthèses (nécessaire
en raison des '-or') avec une boucle (fonctionne quelque soit le nombre
de fichiers trouvés):
% for foo in `find toto -name '*.jpg' -o -name '*.png' -o -name
'*.gif'` ; do
cp -v '{}' . ; done

--
Nicolas S.

Nicolas S.
Le #2096901
"Nicolas S."
cp -v '{}' . ; done


cp -v ${foo} . ; done

--
Nicolas S.

miterrandir
Le #2116181
Nicolas S. le jeudi 3 avril 2008 01:55



% find toto ( -name '*.jpg' -o -name '*.png' -o -name '*.gif' ) -exec
cp -v '{}' . ;



Bonjour

Merci pour la commande ça fonctionne bien.

A+

talon
Le #2117521
Nicolas S.

Apparemment utiliser -exec cp {} . ;
ne marche pas.


% find toto ( -name '*.jpg' -o -name '*.png' -o -name '*.gif' ) -exec
cp -v '{}' . ;


En effet avec les parenthèses ce qui ne marchait pas se met à marcher.
Petit pinaillage supplémentaire, chez moi, pas besoin de '{}', {} va
très bien.

--

Michel TALON


Jacques L'helgoualc'h
Le #2117511
Le 03-04-2008, Michel Talon
Nicolas S.

Apparemment utiliser -exec cp {} . ;
ne marche pas.


% find toto ( -name '*.jpg' -o -name '*.png' -o -name '*.gif' ) -exec
cp -v '{}' . ;


En effet avec les parenthèses ce qui ne marchait pas se met à marcher.
Petit pinaillage supplémentaire, chez moi, pas besoin de '{}', {} va
très bien.


cp -v {} . +

ne marche pas, mais on peut (doit ?) mettre le paramètre multiple à la
fin : (find et cp GNU)

... -exec cp -v -t . {} +


Sinon, une option de find comme -iregex '.*.(jpe?g|png|gif)$' est
plus souple et concise --- à défaut d'être très lisible :).
--
Jacques L'helgoualc'h



Cyrille Lefevre
Le #2157941
Michel Talon wrote:

Apparemment utiliser -exec cp {} . ;
ne marche pas.


-exec cp {} . + ne marche pas, mais la version avec ; marche. Peut-êt re
un oubli de parenthèses ?


Hi, Bonjour,

pour rester dans le find :

http://www.opengroup.org/onlinepubs/009695399/utilities/find.html
-exec utility_name [argument ...] ;
-exec utility_name [argument ...] {} +

+ est "bien" portable. pour une fois, c'est la version GNU qui a du
retard, enfin tout dépend de la version utilisée.

dans ce cas :

cd /var/toto &&
find . -name '*.jpg' -or -name '*.png' -or -name '*.gif' -print |
cpio -pdm /var/titi

PS : un cp $(find ....) . est une aberration...
autre PS : un cp /var/toto/**/* aussi si l'on ne précise pas que cela
ne fonctionne que sous zsh.

pour en revenir à find -exec ... ; vs find ... -exec ... +,
dans le 1er cas, il y a autant de cp que de fichiers,
dans le 2nd, le nombre de commandes (cp) est limité à la xargs,
différence qui n'est pas négligeable en temps d'exécution
selon le nombre de fichiers.
autrement dit, toujours privilégié -exec ... + ou | xargs si possible .
dans le cas de cp, cpio est bien plus optimum.

PS : pb de xargs, si pas de fichier trouvé, au moins une exécution de
la commande sans arguments, ce qui implique une erreur.
attention aux commandes du type ls qui ne renvoie pas d'erreur si pas
d'argument (je me suis fait avoir récemment :), ajoutez -d, dans le pir e
des cas, . est retourné et non la liste des fichiers du répertoire
courant...
autre PS : dans les versions standard, find | xargs pose de serieux pb
pour les fichiers avec des espace, etc. d'où l'utilisation la version
GNU avec -print0 | xargs -0. alternative, simuler xargs par une boucle
while/eval que je n'ai pas sous la main, désolé.

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.


Publicité
Poster une réponse
Anonyme