[newbie][bash] aide pour optimisation script

Le
jose.campos+spam
Bonjour,

Devant récupérer des fichiers (photos) au sein d'une arborescence
anarchique et les reclasser dans autre arborescence cette fois dotée
d'une certaine logique (année/mois/jour/) me voilà lancer dans un script
bash.

La première partie se règle assez facilement :
8<
cd "$origine"
find . -type f -exec cp '{}' $cible ;
8<

La deuxième phase est plus laborieuse :
8<
cd "${cible}"
for photo in *
do
if [ ! -d "$photo" ] ; then
stat -t '%Y%m%d' "$photo" | {
read ch01 ch02 ch03 ch04 ch05 ch06 ch07 ch08 ch09
ch10 ch11 ch12 ch13 ch14 ch15
annee=${ch12:1:4} ; if [ ! -d "$annee" ] ; then mkdir "$annee" ; fi
cd "$annee"
mois=${ch12:5:2} ; if [ ! -d "$mois" ] ; then mkdir "$mois" ; fi
cd "$mois"
jour=${ch12:7:2} ; if [ ! -d "$jour" ] ; then mkdir "$jour" ; fi
mv "${cible}/${photo}" "${cible}/${annee}/${mois}/${jour}/${photo}"
}
fi
done
8<

Tout a marché selon mes désirs, mais j'aimerais savoir :

1- comment optimiser et alléger la deuxième partie
2- comment l'intégrer à la première. J'ai bien essayé de la glisser
entre "-exec" et ";" mais sans succès :(

Merci par avance de vos lumières.

--
Jo
"Don't suffer from insanity, enjoy every minute of it."
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Vincent Lefevre
Le #16604281
Dans l'article José Campos
Bonjour,



Devant récupérer des fichiers (photos) au sein d'une arborescence
anarchique et les reclasser dans autre arborescence cette fois dotée
d'une certaine logique (année/mois/jour/) me voilà lancer dans un script
bash.



La première partie se règle assez facilement :
8<---
cd "$origine"
find . -type f -exec cp '{}' $cible ;
8<---



La deuxième phase est plus laborieuse :
8<---
cd "${cible}"
for photo in *
do
if [ ! -d "$photo" ] ; then
stat -t '%Y%m%d' "$photo" | {
read ch01 ch02 ch03 ch04 ch05 ch06 ch07 ch08 ch09
ch10 ch11 ch12 ch13 ch14 ch15



/usr/bin/stat -t '%Y %m %d' -f %Sm "$photo" | {
read annee mois jour

annee=${ch12:1:4} ; if [ ! -d "$annee" ] ; then mkdir "$annee" ; fi
cd "$annee"
mois=${ch12:5:2} ; if [ ! -d "$mois" ] ; then mkdir "$mois" ; fi
cd "$mois"
jour=${ch12:7:2} ; if [ ! -d "$jour" ] ; then mkdir "$jour" ; fi



mkdir -p "$annee/$mois/jour"

Ça crée tous les niveaux de répertoires qu'il faut, sans erreur si
certains répertoires existent déjà.

mv "${cible}/${photo}" "${cible}/${annee}/${mois}/${jour}/${photo}"
}
fi
done
8<---



Tout a marché selon mes désirs, mais j'aimerais savoir :



1- comment optimiser et alléger la deuxième partie
2- comment l'intégrer à la première. J'ai bien essayé de la glisser
entre "-exec" et ";" mais sans succès :(



Il faut probablement lancer un shell avec l'ensemble des commandes.
Un truc du style:

find . -type f -exec sh -c "dir='$cible'"'`/usr/bin/stat -t %Y/%m/%d -f %Sm "$1"`; mkdir -p "$dir"; cp -p "$1" "$dir"' foo '{}' ;

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Vincent Lefevre
Le #16604271
Dans l'article José Campos
Bonjour,



Devant récupérer des fichiers (photos) au sein d'une arborescence
anarchique et les reclasser dans autre arborescence cette fois dotée
d'une certaine logique (année/mois/jour/) me voilà lancer dans un script
bash.



La première partie se règle assez facilement :
8<---
cd "$origine"
find . -type f -exec cp '{}' $cible ;
8<---



La deuxième phase est plus laborieuse :
8<---
cd "${cible}"
for photo in *
do
if [ ! -d "$photo" ] ; then
stat -t '%Y%m%d' "$photo" | {
read ch01 ch02 ch03 ch04 ch05 ch06 ch07 ch08 ch09
ch10 ch11 ch12 ch13 ch14 ch15



/usr/bin/stat -t '%Y %m %d' -f %Sm "$photo" | {
read annee mois jour

annee=${ch12:1:4} ; if [ ! -d "$annee" ] ; then mkdir "$annee" ; fi
cd "$annee"
mois=${ch12:5:2} ; if [ ! -d "$mois" ] ; then mkdir "$mois" ; fi
cd "$mois"
jour=${ch12:7:2} ; if [ ! -d "$jour" ] ; then mkdir "$jour" ; fi



mkdir -p "$annee/$mois/jour"

Ça crée tous les niveaux de répertoires qu'il faut, sans erreur si
certains répertoires existent déjà.

mv "${cible}/${photo}" "${cible}/${annee}/${mois}/${jour}/${photo}"
}
fi
done
8<---



Tout a marché selon mes désirs, mais j'aimerais savoir :



1- comment optimiser et alléger la deuxième partie
2- comment l'intégrer à la première. J'ai bien essayé de la glisser
entre "-exec" et ";" mais sans succès :(



Il faut probablement lancer un shell avec l'ensemble des commandes.
Un truc du style:

find . -type f -exec sh -c "dir='$cible'"/'`/usr/bin/stat -t %Y/%m/%d -f %Sm "$1"`; mkdir -p "$dir"; cp -p "$1" "$dir"' foo '{}' ;

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
jose.campos+spam
Le #16605101
Vincent Lefevre
/usr/bin/stat -t '%Y %m %d' -f %Sm "$photo" | {
read annee mois jour
>[...]
mkdir -p "$annee/$mois/jour"

Ça crée tous les niveaux de répertoires qu'il faut, sans erreur si
certains répertoires existent déjà.



OK, ça roule impec'. Existe-t-il un moyen de récupérer, non pas la
date de dernière modification, mais la date de création du fichier?


Il faut probablement lancer un shell avec l'ensemble des commandes.
Un truc du style:

find . -type f -exec sh -c "dir='$cible'"/'`/usr/bin/stat -t %Y/%m/%d -f
%Sm "$1"`; mkdir -p "$dir"; cp -p "$1" "$dir"' foo '{}' ;



M'en vais décortiquer ça ;)

Encore une fois merci et bon week-end,

--
Jo
"Don't suffer from insanity, enjoy every minute of it."
Vincent Lefevre
Le #16607361
Dans l'article José Campos
OK, ça roule impec'. Existe-t-il un moyen de récupérer, non pas la
date de dernière modification, mais la date de création du fichier?



Ce n'est peut-être pas aussi simple. La date de création du fichier
n'existe pas en POSIX. C'est spécifique à Mac OS X. La page man du
stat(1) BSD indique:

a, m, c, B
The time file was last accessed or modified, of when the
inode was last changed, or the birth time of the inode.

Mais le "birth time" n'est pas forcément la date de création du fichier
(enfin, tout dépend de ce qu'on entend par "date de création du fichier").
À la place de stat, tu peux utiliser mdls. Mais la date de création n'est
pas préservée par tous les utilitaires.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
jose.campos+spam
Le #16610231
Vincent Lefevre
Ce n'est peut-être pas aussi simple. La date de création du fichier
n'existe pas en POSIX. C'est spécifique à Mac OS X. [...]



OK,

Mais le "birth time" n'est pas forcément la date de création du fichier
(enfin, tout dépend de ce qu'on entend par "date de création du fichier").
À la place de stat, tu peux utiliser mdls.



OK, vu

Mais la date de création n'est pas préservée par tous les utilitaires.



Comme dans le cas présent il s'agissait de *.jpg, j'ai demandé à
GraphicConverter de modifier par lot les dates de création et de
dernière modification en fonction de la date EXIF.

Encore une fois merci de ton aide et de ta patience, bonne semaine.

--
Jo
"Don't suffer from insanity, enjoy every minute of it."
laurent.pertois
Le #16657681
Vincent Lefevre
Ce n'est peut-être pas aussi simple. La date de création du fichier
n'existe pas en POSIX. C'est spécifique à Mac OS X.



Bien pour ça qu'Apple fait aussi des outils :-)

Il suffit d'installer XCode et on a GetFileInfo :

$ /Developer/usr/bin/GetFileInfo -d fichier
08/29/2008 00:36:48

--
Politically Correct Unix - UTILITIES
The "touch" command has been removed from the standard distribution due
to its inappropriate use by high-level managers.
jose.campos+spam
Le #16658371
Laurent Pertois
Il suffit d'installer XCode et on a GetFileInfo :

$ /Developer/usr/bin/GetFileInfo -d fichier
08/29/2008 00:36:48



Et même un "man GetFileInfo". Que demande le peuple!

Merci et bonne journée,

--
Jo
"Don't suffer from insanity, enjoy every minute of it."
Vincent Lefevre
Le #16703741
Dans l'article Laurent Pertois
$ /Developer/usr/bin/GetFileInfo -d fichier
08/29/2008 00:36:48



Une m*rde américaine. Non merci.

--
Vincent Lefèvre 100% accessible validated (X)HTML - Blog: Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
laurent.pertois
Le #16704181
Vincent Lefevre
Dans l'article Laurent Pertois
> $ /Developer/usr/bin/GetFileInfo -d fichier
> 08/29/2008 00:36:48

Une m*rde américaine. Non merci.



??

--
Politically Correct Unix - UTILITIES
The "touch" command has been removed from the standard distribution due
to its inappropriate use by high-level managers.
Anonyme
Le #16704461
Vincent Lefevre
Dans l'article Laurent Pertois
> $ /Developer/usr/bin/GetFileInfo -d fichier
> 08/29/2008 00:36:48

Une m*rde américaine. Non merci.



On se demande pourquoi tu utilise un ordinateur alors... Tous les Mac
sont des merdes américaines, Windows est une merde américaine, et la
plupart des développeurs bossant sur Linux sont également américain, on
peut donc dire que Linux est une sous merde américaine.

--
Anonyme ( jayce <@> mosx.org )
********* MosX.org Ce message est sous licence Creative Commons "by-nc-sa-2.0"
Publicité
Poster une réponse
Anonyme