Мне нужно организовать огромное количество файлов. Это файлы JPG, размещенные в абсурдной структуре папок.
Мне нужно переместить все файлы из их фактического местоположения в организованную структуру папок, сохранив их фактическое местоположение как комментарий EXIF, поскольку в пути есть информация, которую нужно сохранить.
Например, у меня есть файл с таким путем:
/СТАРЫЙ АРХИВ/ОРГАНИЗАЦИЯ 1/1 ФАНТАСТИЧЕСКОЕ СОБЫТИЕ/1995 ПИППО что-то делает.jpg
Место назначения будет выглядеть примерно так: Archive Digital/AA/1995_BB_000002.jpg
Моя идея заключается в том, чтобы запустить скрипт из пути OLD ARCHIVE/, чтобы вся информация была в fname var. Затем извлечь информацию из fname var и поместить ее в exif (и в path), в конце переместить файл, регистрируя то, что я делаю.
Я пишу это в bash, это работало, но возникли некоторые проблемы с управлением пробелами, поэтому я попытался сделать это совместимым с пробелами... но это больше не работает.
Кто-нибудь может мне помочь?
Заранее спасибо.
#!/bin/bash
#Parametri: CartellaOriginale CartellaOutput Prefisso NumeroIniziale Keywords
filenamePrefix="$3"
filenameNumber=$(printf "%05d" $4)
data=$(date +%F)
filelog="fileMovedLog_$data.txt"
CommonKeywords="$5"
echo "DEV Working on $1"
echo "DEV output folder $2"
echo "DEV filename start $filenamePrefix$filenameNumber"
echo "$1/$filelog"
echo "Backup in ${1%\/}_BAK/"
#echo "$data"
read -p "Press enter to continue"
echo 'Backup in corso'
#cp -R "$1" "${1%\/}_BAK/"
echo 'Backup terminato, inizio elaborazione'
#mkdir "$2"
touch "$1/$filelog"
find "$1" -name "*.jpg" -or -name "*.JPG" -type f -not -path "*_BAK"| while read fname; do
echo "$fname"
#Chiedo l'anno
forseAnno=$(echo `grep -oP '(?<!\d)\d{4}(?!\d)' <<< "$fname"`)
if [ -z "$forseAnno" ]
then
forseAnno='ND'
fi
echo "Inserire cartella anno dove inserire la foto oppure lasciare vuoto se $forseAnno"
read annoIn </dev/tty
if [ -z "$annoIn" ]
then #Se input è vuoto
anno="$forseAnno"
else #ho input, metto lì.
anno="$annoIn"
fi
#echo "$anno"
#Keyword per Lightroom
#Estraggo alcune possibili KeyWord
string=${fname,,}
extraKey=''
if grep -q 'palio' <<< "$string"; then
extraKey=',palio del niballo'
fi
if grep -q 'dama' <<< "$string"; then
extraKey="${extraKey},dama"
fi
if grep -q 'not' <<< "$string"; then
extraKey="${extraKey},nott de biso"
fi
if grep -q 'cavaliere' <<< "$string"; then
extraKey="${extraKey},cavaliere"
fi
if grep -q 'bigorda' <<< "$string"; then
extraKey="${extraKey},bigorda"
fi
if grep -q 'corteo' <<< "$string"; then
extraKey="${extraKey},corteo"
fi
if grep -q 'paggi' <<< "$string"; then
extraKey="${extraKey},paggi"
fi
echo "$extraKey"
read -e -p "Correggere le Keywords: " -i "$anno,$CommonKeywords$extraKey" KEYWORD </dev/tty
suffix=$(printf "%05d" $filenameNumber)
exiftool -p -Keywords='"$KEYWORD $fname"' -overwrite_original
#Registro il precedente nome file nella descrizione
exiftool -p -Description+=\''ERA: "$fname"'\' "$fname" -overwrite_original
#Sistemo la CreateDate
echo `exiftool -wm cg -CreateDate=\'"$anno":01:01 00:00:00\' -overwrite_original "$fname"`
if [ $? -ne 0 ] #avevo già una data
then
datafile=(exiftool -S -createdate "$fname")
while true
do
if [ $anno -lt 2021 ] #la scrittura della data in EXIF la faccio solo se è un anno minore di 2021. Se ho messo 5060 per indicare anni 50-60 non lo metto
then
read -e -p "Sovrascrivere la data $datafile con $anno?[Yes/No/Vuoto]" -i "Y" yn </dev/tty
else
read -e -p "Sovrascrivere la data $datafile con $anno?[Yes/No/Vuoto]" -i "N" yn </dev/tty
fi
case $yn in
[Yy]* ) exiftool -p -CreateDate=\'"$anno":01:01 00:00:00\' -overwrite_original;break;;
[Nn]* ) break;; #Non fo una sega
[0123456789][0123456789][0123456789][0123456789]* ) exiftool -p -CreateDate=\'"$yn":01:01 00:00:00\' -overwrite_original;break;;
* ) echo "Inserire Y[es]/N[o] o l'anno";;
esac
done
fi
#Procedo allo spostamento e logging
echo 'Sposto '"$fname $2/$anno/$filenamePrefix$suffix.jpg"
read -p "Confermi?"
mv \""$fname"\" \""$2/$anno/$filenamePrefix$suffix.jpg"\"
echo "\"$fname\"; \"$filenamePrefix$suffix.jpg\"" >>$1/$filelog
((filenameNumber++))
echo ""
done
echo "Completato";