Citation
lulu62
Bonjour,
Je suis plutôt novice dans le monde linux et en ce
moment je me familiarise avec les commandes
shell.
Sur mon serveur dédié j'heberge qq sites web avec
à l'intérieur de ceux-ci de nombreuses photos au
format jpg.
j'ai récemment installé le logiciel de gestion de
photo en ligne "Gallery", et maintenant je cherche
à centraliser toutes les photos se trouvant dans
les différents sites web vers le repertoire data
de Gallery
Le problème c'est que les photos sont dispersés
partout.
Je cherche donc une commande shell qui me
permettrait de trouver les photos et ensuite les
copier vers le repertoire data de Gallery.
J'ai trouvé cette commande :
find /directory/ -iname *.JPG -exec cp "{}"
/another_directory/ \;
Cela fonctionne bien : je copie toutes les photos
.jpg ou .JPG dispersées dans les sous-répertoires
de /directory/ vers /another_directory/
Cependant je me retrouve avec toutes les photos
mélangées dans "another_directory".
Je souhaiterais donc au moins garder le nom du
dernier sous-répertoire dans lequel se trouve les
photos afin que je sache à quoi correspondent ces
photos, je ne sais pas si c'est faisable surtout
le fait de garder uniquement le dernier
sous-repertoire.
J'espère que vous avez compris mon problème et que
vous pouvez m'aider à le résoudre, merci d'avance
!
Bien sûr, je comprends ton idée. c'est faisable mais faut avoir une certaine habitude de la programmation de scripts.
Le pb de "find" est qu'il ne travaille que sur le fichier final et oblitère totalement le répertoire parent.
Bon, je vais essayer de faire un truc "en live", sans tester, au fur et à mesure que ça me vient
#!/bin/sh
# Lecture de chaque fichiers issus du find
find /directory/ -iname *.JPG |while read fic
do
# Donc ici, la variable "fic" contient un nom complet
# On va la couper sur le "/"
old="$IFS"
IFS="/"
set $fic
IFS="$old"
# Maintenant "$#" contient la profondeur du chemin => 2 cas possibles
# - $# = 1 parce qu'il n'y a pas d'arborescence
# - $# >= 2 parce qu'il y a une arborescence d'au-moins 1 répertoire
case $# in
1) # on n'a qu'un nom de fichier
# On crée le nom final
dir="/another_directory"
dest="$dir/$1"
;;
2) # On a un répertoire et un fichier
# On crée le nom final
dir="/another_directory/$1"
dest="$dir/$2"
;;
*) # On a une arborescence plus longue
# On supprime tout ce qu'il y a avant les deux derniers noms
shift `expr $# - 2`
# On crée le nom final
dir="/another_directory/$1"
dest="$dir/$2"
esac
# On crée le répertoire de destination s'il n'existe pas
test ! -d "$dir" && mkdir -p "$dir"
# On affiche la copie qu'on va faire
echo "cp $file $dest"
# on fait la copie
cp "$file" "$dest"
done
Bon, j'ai pas testé ce truc mais ça me semble correct. On peut faire probablement plus court et plus "élégant" mais là, j'ai pas trop le temps. Essaye de bien comprendre l'idée du script et rappelle toi qu'en script, quand un outil te manque c'est très facile de le créer.
Tu peux télécharger mon cours de shell ici: [
fr.lang.free.fr]
L'homme qui murmurait à l'oreille des pingouins
[
fr.lang.free.fr]
Poste le Wednesday 11 April 2007 15:45:23