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

script recherche + copie images

17 réponses
Avatar
Carmelo
Bonjour,

j'essaie de faire un script qui :

- recherche les images contenues dans un dossier "source" + ses sous
dossiers (plusieurs sous niveaux)
- copie ces images dans un répertoire "copie", mais en gardant
l'arborescence d'origine.

je m'explique :

source/dossier1/fichiers images + autres fichiers divers
source/dossier2/dossier2.2/fichiers images + autres fichiers divers
source/dossierX/fichiers images + autres fichiers divers

avec pour résultat :

copie/dossier1/que_les_fichiers_images
copie/dossier2/dossier2.2/que_les_fichiers_images
copie/dossierX/que_les_fichiers_images


voici ce à quoi j'ai pensé, avec l'aide d'un ami, mais ça ne cherche
pas dans les sous dossiers, et ça ne garde pas l'arborescence …


#!/bin/bash
src="/media/source"
dest="/media/copie/"


for file in $src/*.jpg $src/*.png $src/*.gif

do

mv $file $dest
done
exit 0


merci pour votre aide.

Carmelo

10 réponses

1 2
Avatar
Fabien LE LEZ
On Wed, 26 Oct 2011 16:41:30 +0200, Carmelo
:

- recherche les images contenues dans un dossier "source" + ses sous
dossiers (plusieurs sous niveaux)
- copie ces images dans un répertoire "copie", mais en gardant
l'arborescence d'origine.



rsync -a --include=*.gif --include=*.jpg ... source/ copie/
Avatar
Jean-Jacques Gerbaud
Le 26/10/2011 16:41, Carmelo a écrit :

Bonjour,

j'essaie de faire un script qui :

- recherche les images contenues dans un dossier "source" + ses sous
dossiers (plusieurs sous niveaux)
- copie ces images dans un répertoire "copie", mais en gardant
l'arborescence d'origine.

je m'explique :

source/dossier1/fichiers images + autres fichiers divers
source/dossier2/dossier2.2/fichiers images + autres fichiers divers
source/dossierX/fichiers images + autres fichiers divers

avec pour résultat :

copie/dossier1/que_les_fichiers_images
copie/dossier2/dossier2.2/que_les_fichiers_images
copie/dossierX/que_les_fichiers_images


voici ce à quoi j'ai pensé, avec l'aide d'un ami, mais ça ne cherche
pas dans les sous dossiers, et ça ne garde pas l'arborescence …


#!/bin/bash
src="/media/source"
dest="/media/copie/"


for file in $src/*.jpg $src/*.png $src/*.gif

do

mv $file $dest
done
exit 0


merci pour votre aide.

Carmelo




Il y a quelques temps, j'ai eu la malchance/déveine/stupidité/ignorance de
perdre tous mes fichiers super/hyper importants J'en ai récupéré quelques
uns avec le script bash suivant (qui ne vient pas de moi) :

#!/bin/bash
find / <endroit_où_chercher> -type -f -iname "*jpg" -exec mv -t
<endroit_où_ranger> '{}';

On nomme ce fichier comme on le veut et on fait pareil pour .png et .gif

A moins que quelqu'un de plus malin réussisse à faire cette manoeuvre en une
seule fois.

Quoi qu'il en soit, pour ce genre de script, la commande "man find" ne peut
être que très utile !

--
Jean-Jacques Gerbaud
entre Dauphiné et PACA
Avatar
Carmelo
On 2011-10-26 16:17:25 +0000, Fabien LE LEZ said:

On Wed, 26 Oct 2011 16:41:30 +0200, Carmelo
:

- recherche les images contenues dans un dossier "source" + ses sous
dossiers (plusieurs sous niveaux)
- copie ces images dans un répertoire "copie", mais en gardant
l'arborescence d'origine.



rsync -a --include=*.gif --include=*.jpg ... source/ copie/



merci pour ta réponse, j'ai testé mais ça m'a copié plein de fichiers …
dont aucun n'a l'extension gif ou jpg ...

un ls dans le répertoire copie :


$ ls
AppData
NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TM.blf
NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TMContainer00000000000000000001.regtrans-ms

NTUSER.DAT{6cced2f1-6e01-11de-8bed-001e0bcd1824}.TMContainer00000000000000000002.regtrans-ms

ntuser.dat
ntuser.dat.LOG1
ntuser.dat.LOG2
ntuser.dat{cca33988-9b40-11e0-a032-002186ac64d5}.TM.blf
ntuser.dat{cca33988-9b40-11e0-a032-002186ac64d5}.TMContainer00000000000000000001.regtrans-ms

ntuser.dat{cca33988-9b40-11e0-a032-002186ac64d5}.TMContainer00000000000000000002.regtrans-ms

ntuser.ini


c'est bizarre non ?
Avatar
Fabien LE LEZ
On Wed, 26 Oct 2011 23:45:15 +0200, Carmelo
:

rsync -a --include=*.gif --include=*.jpg ... source/ copie/



merci pour ta réponse, j'ai testé mais ça m'a copié plein de fichiers …



Oui, je me suis aperçu après-coup que c'était une connerie. J'ai
essayé d'annuler mon message, mais ça n'a pas fonctionner.
Cela dit, rsync est probablement la bonne piste ; il suffit de trouver
la bonne option.
Avatar
moi-meme
Le Thu, 27 Oct 2011 00:57:01 +0200, Fabien LE LEZ a écrit :

Cela dit, rsync est probablement la bonne piste ; il suffit de trouver


la
bonne option.



à ce moment là grsync en graphique
Avatar
Carmelo
On 2011-10-26 22:57:01 +0000, Fabien LE LEZ said:

Cela dit, rsync est probablement la bonne piste ; il suffit de trouver
la bonne option.



Exact !!
J'ai trouvé grâce à ce lien :
http://logbuffer.wordpress.com/2011/03/24/linux-copy-only-certain-filetypes-with-rsync-from-foldertree/


du coup, voici la commande adaptée à ma question :

rsync -avr --include="*/" --include="*.[Jj][Pp][Gg]"
--include="*.[Pp][Nn][Gg]" --include="*.[Bb][Mm][Pp]"
--include="*.[Jj][Pp][Ee][Gg]" --include="*.[Gg][Ii][Ff]" --exclude="*"
/source/ /copie/

Encore merci pour votre aide :)

Carmelo
Avatar
Hugues
Bonjour,

Outre la réponse "rsync" qui est excellente ;

Ce cher Carmelo a posté :

for file in $src/*.jpg $src/*.png $src/*.gif



Problème, il suffit qu'une seule des *.jpg *.png ou *.gif ne renvoie
aucun résultat pour que ça fasse planter tout ton script...

Pour éviter ça, j'utiliserais plutôt find.

J'aurais plutôt écrit :

cd $src
for file in $(find . -name "*.jpg" -o -name "*.png" -o -name "*.gif")
do
mkdir -p $(dirname $dest/$i)
mv $i $dest/$i
done


Ou mieux, avec zsh:

for file in $(find $src -name "....")
do
mkdir -p ${${file/$src/$dest}:h}
mv $file ${file/$src/$dest}
done



L'intérêt par rapport à rsync, c'est de pouvoir faire ta petite cuisine
interne (par exemple passer un coup d'imagemagick à chaque fichier à la
copie, etc..)


--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Hugues
Ce cher Hugues a posté :


J'aurais plutôt écrit :

cd $src
for file in $(find . -name "*.jpg" -o -name "*.png" -o -name "*.gif")
do
mkdir -p $(dirname $dest/$i)
mv $i $dest/$i
done



Le lecteur attentif aura bien entendu remplacé "$i" par "$file" ! :)

--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
Avatar
Carmelo
On 2011-10-27 13:08:09 +0000, Hugues said:

Problème, il suffit qu'une seule des *.jpg *.png ou *.gif ne renvoie
aucun résultat pour que ça fasse planter tout ton script...

Pour éviter ça, j'utiliserais plutôt find.

J'aurais plutôt écrit :

cd $src
for file in $(find . -name "*.jpg" -o -name "*.png" -o -name "*.gif")
do
mkdir -p $(dirname $dest/$i)
mv $i $dest/$i
done



Ta solution m'apparaît très bonne, mais il me semble qu'il y a un petit
souci de fonctionnement.

J'ai juste modifié la commande 'mv' par 'cp' car je veux faire une
copie et non un déplacement.

Donc ça me donne :

#!/bin/bash

    src="/Volumes/Untitled/Users/"
    dest="/Users/Carmelo/Desktop//test2"
 

    cd $src
         for file in $(find . -name "*.jpg" -o -name "*.png" -o -name "*.gif")
         do
                mkdir -p $(dirname $dest/$i)
                cp $i $dest/$i
         Done

Par contre, lors de l'exécution, j'obtiens ça :

Carmelo$ ./script-jpg.sh 
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ...
target_directory
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ...
target_directory
usage: cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file target_file
       cp [-R [-H | -L | -P]] [-fi | -n] [-apvX] source_file ...
target_directory

..



Aurais-tu une idée ?
Avatar
Hugues
Ce cher Carmelo a posté :


Ta solution m'apparaît très bonne, mais il me semble qu'il y a un
petit souci de fonctionnement.



Tu as lu ma réponse de 16h01 ?
Message-ID:


--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
1 2