Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

copie de fichiers

8 réponses
Avatar
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.

8 réponses

Avatar
talon
miterrandir wrote:
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

Avatar
Marc
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 ?


Avatar
Nicolas S.
(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.

Avatar
Nicolas S.
"Nicolas S." a écrit:

cp -v '{}' . ; done


cp -v ${foo} . ; done

--
Nicolas S.

Avatar
miterrandir
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+

Avatar
talon
Nicolas S. wrote:

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


Avatar
Jacques L'helgoualc'h
Le 03-04-2008, Michel Talon a écrit :
Nicolas S. wrote:

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



Avatar
Cyrille Lefevre
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.