Créer des sous-directorys et organiser les files par date à partir du nom de file

J'ai utilisé le script suivant pour organiser mes photos dans des directorys "Date":

for x in *.JPG; do d=$(date -r "$x" +%Y-%m-%d) mkdir -p "$d" mv -- "$x" "$d/" done 

Ce script fonctionne très bien. Mes files de photos suivent la même convention d'appellation «IMG_20131125_090000.JPG», c'est-à-dire que la date et l'heure sont sockets en photo. Existe-t-il un moyen de modifier le script ci-dessus pour qu'il catégorise toujours les directorys de date mais utilise la date dans le nom de file plutôt que d'utiliser la date de modification du file?

Réponse fixée pour get 2013-11-25 au lieu de 20131125

Si votre script fonctionne avec un bash compatible bash , la solution la plus simple est de replace

 d=$(date -r "$x" +%Y-%m-%d) 

avec

 d="${x:4:4}-${x:8:2}-${x:10:2}" 

solution portable avec expr:

 d=$(expr substr "$x" 5 4)-$(expr substr "$x" 9 2)-$(expr substr "$x" 11 2) 

Si vous avez seulement besoin de 20131125 au lieu de 2013-11-25 comme nom de directory, vous pouvez également

Solution avec sed:

 d=$(echo "$x" | sed 's/.*_\([0-9]*\)_.*/\1/') 

Les commands sed remplace le nom de file par le nombre entre les traits de soulignement (= la date).

Solution avec awk:

 d=$(echo "$x" | awk -F _ '{print $2}') 

Solution avec coupe :

 d=$(echo "$x" | cut -d_ -f 2') 

Vous pouvez utiliser :

 export LC_ALL=C for x in *.JPG; do d=$(date -d $( cut -d"_" -f2 <<< ${x} ) +%Y-%m-%d ) mkdir -p "$d" mv -- "$x" "$d/" done