script recherche + copie images
Le
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
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
:
rsync -a --include=*.gif --include=*.jpg ... source/ copie/
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
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 ?
:
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.
la
à ce moment là grsync en graphique
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
Outre la réponse "rsync" qui est excellente ;
Ce cher Carmelo a posté :
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/]
Le lecteur attentif aura bien entendu remplacé "$i" par "$file" ! :)
--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]
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 ?
Tu as lu ma réponse de 16h01 ?
Message-ID:
--
Hugues Hiegel [http://www.hiegel.fr/~hugues/]