Synology Script classe photos par date dans AAAA/MM

LucV59

Nouveau membre
9 Février 2023
14
1
3
Bonjour,

je cherche à écrire un script DANS le planificateur de taches pour déplacer des photos du répertoire « Photo/A_Classser » dans le répertoire Photo/AnnéeMois selon la date de la photo.

entre les ash, bash et autres, je ne trouve pas la bonne syntaxe.
Qui pourrait m'aider ?

Merci par avance. Luc
 
Bonjour,

je cherche à écrire un script DANS le planificateur de taches pour déplacer des photos du répertoire « Photo/A_Classser » dans le répertoire Photo/AnnéeMois selon la date de la photo.

entre les ash, bash et autres, je ne trouve pas la bonne syntaxe.
Qui pourrait m'aider ?

Merci par avance. Luc
bonjour
'selon la date de la photo' n'est pas un critère de sélection , mais un critère de tri.
Il faudrait préciser ce que tu veux
 
Bonjour,

merci pour ta réponse.
Je vais essayer de préciser ce que je veux.

J'ai des photos dans le répertoire « Photo/A_Classer »
Par exemple, j'ai des photos avec la date de modification du 06/02/2023.
je voudrais déplacer ces photos dans le répertoire "Photo/2023/02"
Le répertoire 2023/02 doit se créer s'il n'existe pas.

La date de modification est la colonne que l'on voit dans File Station.
J'espère que c'est plus clair, sinon, tu me dis.

Merci. Luc
 
oui je peux, mais je viens ici avec mon smartphone quand j'ai qq mn pour aider ... là , il va me falloir un peu plus de temps et mon laptop :D

EDIT : c'est fait...
Tu peux faire ça en une seule ligne de commande:

Cette commande va te permettre de lister les commandes shell qui vont être générées à partir de ton répertoire "A_classer" ( avec 3 "S" dans ton énoncé!! :D .. donc attention à la casse et à l'exactitude...)

Pour tester :
Code:
cd /Photo/Aclasser ; ls --full-time| awk   ' /^\-/ { split($6,a,"-") ; print "mkdir ../" a[1] ; fic="" ; for (i=9;i<=NF;i++) { fic=(fic " " $i)
 } ;print "mkdir ../" a[1] "/" a[2] ; print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2] } '

Pour que ces commandes listées s'exécutent , il suffit de créer un "pipe" de ce listing avec shell :
Code:
cd /Photo/Aclasser ; ls --full-time| awk   ' /^\-/ { split($6,a,"-") ; print "mkdir ../" a[1] ; fic="" ; for (i=9;i<=NF;i++) { fic=(fic " " $i)
 } ;print "mkdir ../" a[1] "/" a[2] ; print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2] } ' |sh

C'est du brutal ( copyright "Les tontons flingueurs"..) : ça tenter de créer les sous-répertoire sans vérifier qu'ils existent déjà, donc t'auras des erreurs de création de répertoire dont il ne faudra pas tenir compte...
 
Dernière édition:
  • J'adore
Réactions: EVO
Bonjour shaks2022,

merci pour ta rapidité.
Je teste et je reviens vers toi asap.

bien vu pour les 3 s...j'étais trop pressé, stressé !
A+. Luc
 
Re,
cela fonctionne, sauf msg erreur répertoire existe, ce qui était prévu. Donc, conforme.

J'ai mis plusieurs lignes pour que ce soit plus clair pour moi :
Code:
# Déplacer les photos vers AAAA/MM
#
# https://www.forum-nas.fr/threads/script-classe-photos-par-date-dans-aaaa-mm.19906/
# Merci @shaks2022
cd /volume1/photo/A_classer ;
ls --full-time| awk   ' /^\-/ { split($6,a,"-") ;
print "mkdir ../" a[1] ;
echo "mkdir ../" a[1]
fic="" ;
for (i=9;i<=NF;i++) { fic=(fic " " $i) } ;
echo "mkdir ../" a[1] "/" a[2] ;
print "mkdir ../" a[1] "/" a[2] ;
print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2] } ' |sh

J'essaye d'ajouter un test à partir de cela, mais ça ne fonctionne pas !
Code:
if [ ! -d "mkdir ../" a[1] "/" a[2] ]; then
            # creation repertoire si inex
            echo "mkdir ../" a[1] "/" a[2]
            print "mkdir ../" a[1] "/" a[2] ;
        fi
 
bonjour
utilise les balises CODE et /CODE entre [ et ] autour de ton code pour le rendre lisible sur le forum .
sinon, ça ne peut pas fonctionner comme ça . L'idée de base est de générer du code shell depuis awk. c'est pas awk qui fait le test, il doit générer le code qui fera le test . donc le bloc 'if' doit être entre double quotes.

Si les messages d'erreur te gênent , rajoute simplement 2>/dev/null après les commandes mkdir (dans la partie entre les doubles quotes puisque c'est à faire générer par awk )

Autre remarque , le code serait bien plus simple si on était sûr que les noms des fichiers à déplacer ne peuvent pas contenir d'espace

Et enfin, si tu veux un mode verbose à l'exécution , tu rajoutes -x tout au bout du code , en option de l'appel à sh ( sh -x )
 
Dernière édition:
Merci.
C'est ça que je dois faire :

CODE
[
print "mkdir 2>/dev/null../" a[1] ;
print "mkdir 2>/dev/null../" a[1] "/" a[2] ;
]
/CODE
Message automatiquement fusionné :

J'ai pas réussi avec CODE 🥲
 
Bonsoir,

a priori, c'est OK: pas de msg d'erreur, mais pas d"echo" non plus.
Pour le Code, c'est pas moi chef; toujours pas compris.
Encore Merci. Luc
 
Hello
tu dois mettre ton code entre [ CODE ] et [ /CODE ] ( sans les espaces dans le truc ) , pour que ça apparaisse comme du code

Voici une version amérliorée : utilisation de mkdir -p pour créer directement ce qui manque, au lieu de 2 mkdir, avec ajout de la condition d'iexistance du répertoire + reporting creation et reporting move.
Note : si on passe à la ligne , ya plus besoin du ";"....
Note2 : j'ai indenté et mis au propre. N'essaye pas de splitter les commandes print car elles doivent rester comme ça.
Note3 : je teste le code, mais pas dans la moulinette du "sh", donc le shell est bien généré, mais je peux toujours avoir fait une erreur dans le code généré ( juste relecture code shell généré, mais pas exécution ).
Note4 : je te conseille de plutot passer par /share/photo/A_Classer , afin de ne pas te retrouver dans le chagrin le jour où tu déplaces ton répertoire photo sur le volume2 par exemple, et aussi pour ne plus y accéder si il n'est pas monté

Code:
cd /volume1/photo/A_classer || exit 8
ls --full-time| awk   '
/^\-/ {
        split($6,a,"-")
        fic=""
        for (i=9;i<=NF;i++) {
                fic=(fic " " $i)
        }
        print "[ -d ../" a[1] "/" a[2] " ]||(mkdir -p ../" a[1] "/" a[2] ";echo \"Creation " a[1] "/" a[2] ",rc=$?\")"
        print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2]
        print "echo \"mv " substr(fic,2) "\" ../" a[1] "/" a[2] ",rc=$?\""
} '
 
Dernière édition:
Bonjour,

merci pour ta patience.

j'ai "copié dans le presse-papier" et ...ça marche plus.

voici le log :

Le planificateur de tâches a terminé une tâche planifiée.

Tâche : Xfer_Photo_AAAA_MM
Heure de début : Sun, 12 Feb 2023 08:37:41 GMT
Heure d'arrêt : Sun, 12 Feb 2023 08:37:41 GMT
État actuel : 0 (Normal)
Sortie/erreur standard :
[ -d ../2023/02 ]||(mkdir -p ../2023/02;echo "Creation 2023/02,rc=$?")
mv "2023 02 04 Enduro JEF svg.jpg" ../2023/02
echo "mv 2023 02 04 Enduro JEF svg.jpg" ../2023/02,rc=$?"
[ -d ../2023/01 ]||(mkdir -p ../2023/01;echo "Creation 2023/01,rc=$?")
mv "DJI_0018 Dattiers svg.JPG" ../2023/01
echo "mv DJI_0018 Dattiers svg.JPG" ../2023/01,rc=$?"
[ -d ../2023/02 ]||(mkdir -p ../2023/02;echo "Creation 2023/02,rc=$?")
mv "IMG_7732svg.JPG" ../2023/02
echo "mv IMG_7732svg.JPG" ../2023/02,rc=$?"

J'ai fait une erreur, chef ?
 
Bonjour,

merci pour ta patience.

j'ai "copié dans le presse-papier" et ...ça marche plus.

voici le log :

Le planificateur de tâches a terminé une tâche planifiée.

Tâche : Xfer_Photo_AAAA_MM
Heure de début : Sun, 12 Feb 2023 08:37:41 GMT
Heure d'arrêt : Sun, 12 Feb 2023 08:37:41 GMT
État actuel : 0 (Normal)
Sortie/erreur standard :
[ -d ../2023/02 ]||(mkdir -p ../2023/02;echo "Creation 2023/02,rc=$?")
mv "2023 02 04 Enduro JEF svg.jpg" ../2023/02
echo "mv 2023 02 04 Enduro JEF svg.jpg" ../2023/02,rc=$?"
[ -d ../2023/01 ]||(mkdir -p ../2023/01;echo "Creation 2023/01,rc=$?")
mv "DJI_0018 Dattiers svg.JPG" ../2023/01
echo "mv DJI_0018 Dattiers svg.JPG" ../2023/01,rc=$?"
[ -d ../2023/02 ]||(mkdir -p ../2023/02;echo "Creation 2023/02,rc=$?")
mv "IMG_7732svg.JPG" ../2023/02
echo "mv IMG_7732svg.JPG" ../2023/02,rc=$?"

J'ai fait une erreur, chef ?
bonjour
'|sh ' à la fin pour que les instructions en shell que tu vois remonter soient exécutées au lieu de juste être affichées .. ;)
 
Y'a du mieux : 2 sur 3 réussi.

État actuel : 2 (Interrompu)
Sortie/erreur standard :
mv 2023 02 04 Enduro JEF svg.jpg ../2023/02,rc=0
[ -d ../2023/01 ]||(mkdir -p ../2023/01;echo Creation 2023/01,rc=0)
mv DJI_0018 Dattiers svg.JPG ../2023/01
echo mv DJI_0018 Dattiers svg.JPG ../2023/01,rc=0
sh: line 9: unexpected EOF while looking for matching `"'
sh: line 10: syntax error: unexpected end of file
 
Y'a du mieux : 2 sur 3 réussi.

État actuel : 2 (Interrompu)
Sortie/erreur standard :
mv 2023 02 04 Enduro JEF svg.jpg ../2023/02,rc=0
[ -d ../2023/01 ]||(mkdir -p ../2023/01;echo Creation 2023/01,rc=0)
mv DJI_0018 Dattiers svg.JPG ../2023/01
echo mv DJI_0018 Dattiers svg.JPG ../2023/01,rc=0
sh: line 9: unexpected EOF while looking for matching `"'
sh: line 10: syntax error: unexpected end of file
on ne devrait pas voir les instructions si tu as rajouté |sh à la fin ... t'as pas remis les guillemets au moins ? c'était une citation , faut faire comme à la fin de la 1ère version du code.

Code:
cd /volume1/photo/A_classer || exit 8
ls --full-time| awk   '
/^\-/ {
        split($6,a,"-")
        fic=""
        for (i=9;i<=NF;i++) {
                fic=(fic " " $i)
        }
        print "[ -d ../" a[1] "/" a[2] " ]||(mkdir -p ../" a[1] "/" a[2] ";echo \"Creation " a[1] "/" a[2] ",rc=$?\")"
        print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2]
        print "echo \"mv " substr(fic,2) "\" ../" a[1] "/" a[2] ",rc=$?\""
} ' |sh
 
Dernière édition:
Je me lance :
Code:
cd /volume1/photo/A_classer || exit 8
ls --full-time| awk   '
/^\-/ {
        split($6,a,"-")
        fic=""
        for (i=9;i<=NF;i++) {
                fic=(fic " " $i)
        }
        print "[ -d ../" a[1] "/" a[2] " ]||(mkdir -p ../" a[1] "/" a[2] ";echo \"Creation " a[1] "/" a[2] ",rc=$?\")"
        print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2]
        print "echo \"mv " substr(fic,2) "\" ../" a[1] "/" a[2] ",rc=$?\""
} ' |sh
 
  • J'aime
Réactions: shaks2022
Je suis revenu à la version précédente qui traite tous les fichiers, y compris ceux ayant plus d'un espace dans leur nom.

Je n'ai pas la liste des déplacements, ni le nombre, mais tout s'est bien déroulé.

Le planificateur de tâches a terminé une tâche planifiée.

Tâche : V4_Xfer_Photo_A_Classer_AAAA_MM
Heure de début : Sun, 12 Feb 2023 16:40:00 GMT
Heure d'arrêt : Sun, 12 Feb 2023 16:40:01 GMT
État actuel : 0 (Normal)
Sortie/erreur standard :

Code:
# Déplacer les photos vers AAAA/MM
# 
# https://www.forum-nas.fr/threads/script-classe-photos-par-date-dans-aaaa-mm.19906/
# Merci @shaks2022 

cd /volume1/photo/A_classer ; 
ls --full-time| awk   ' /^\-/ { split($6,a,"-") ; 
print "mkdir ../" a[1] " 2>/dev/null" ; 
echo "mkdir ../" a[1]
fic="" ; 
for (i=9;i<=NF;i++) { fic=(fic " " $i) } ;
echo "mkdir ../" a[1] "/" a[2] ;
print "mkdir ../" a[1] "/" a[2] " 2>/dev/null" ;
print "mv \"" substr(fic,2) "\" ../" a[1] "/" a[2] } ' |sh
 
@shaks2022
J'espère que je ne t'ai pas vexé en revenant à la version précédente:
Je préfère que tout soit traité, même si le log ne m'indique pas le détail.

Encore un grand merci pour ton aide, car je n'étais pas prêt d'y arriver.
J'aurai bien voulu trouver un endroit simple pour comprendre/apprendre la syntaxe que tu maitrises parfaitement.
J'espère que je pourrai encore faire appel à tes services.

A bientôt. Luc
 
Je suis revenu à la version précédente qui traite tous les fichiers, y compris ceux ayant plus d'un espace dans leur nom.
............
Tu es sûr ? cette histoire d'espace dans le nom de fichier n'était mentionné dans une de mes réponses que j'ai corrigé rapidement suite à erreur d'analyse....
@shaks2022
J'espère que je ne t'ai pas vexé en revenant à la version précédente:
Je préfère que tout soit traité, même si le log ne m'indique pas le détail.

Encore un grand merci pour ton aide, car je n'étais pas prêt d'y arriver.
J'aurai bien voulu trouver un endroit simple pour comprendre/apprendre la syntaxe que tu maitrises parfaitement.
J'espère que je pourrai encore faire appel à tes services.

A bientôt. Luc
Pas de soucis, c'est toi qui décide au final :)