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

[newbie][bash] aide pour optimisation script

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

10 réponses

1 2
Avatar
Vincent Lefevre
Dans l'article <1im3i4h.1y6c7dj1upsypaN%jose.campos+,
José Campos <jose.campos+ écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
Vincent Lefevre
Dans l'article <1im3i4h.1y6c7dj1upsypaN%jose.campos+,
José Campos <jose.campos+ écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
jose.campos+spam
Vincent Lefevre <vincent+ wrote:

/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."
Avatar
Vincent Lefevre
Dans l'article <1im4f3n.fzfcb11o8mfjmN%jose.campos+,
José Campos <jose.campos+ écrit:

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 - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
jose.campos+spam
Vincent Lefevre <vincent+ wrote:

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."
Avatar
laurent.pertois
Vincent Lefevre <vincent+ wrote:

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.
Avatar
jose.campos+spam
Laurent Pertois wrote:

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."
Avatar
Vincent Lefevre
Dans l'article <1imetc5.13toyna1vcjwfsN%,
Laurent Pertois écrit:

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



Une m*rde américaine. Non merci.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Avatar
laurent.pertois
Vincent Lefevre <vincent+ wrote:

Dans l'article <1imetc5.13toyna1vcjwfsN%,
Laurent Pertois écrit:

> $ /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.
Avatar
Anonyme
Vincent Lefevre <vincent+ wrote:

Dans l'article <1imetc5.13toyna1vcjwfsN%,
Laurent Pertois écrit:

> $ /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 <http://www.mosx.org/> *********
Ce message est sous licence Creative Commons "by-nc-sa-2.0"
<http://creativecommons.org/licenses/by-nc-sa/2.0/fr/>
1 2