Grazie a @John1024 !
Avevo bisogno di rinominare i file con estensioni diverse nello stesso tempo, in base alla data dell'ultima modifica :
for f in *; do
fn=$(basename "$f")
mv "$fn" "$(date -r "$f" +"%Y-%m-%d_%H-%M-%S")_$fn"
done
"DSC_0189.JPG" ➜ "2016-02-21_18-22-15_DSC_0189.JPG"
"MOV_0131.avi" ➜ "2016-01-01_20-30-31_MOV_0131.avi"
Se non vuoi mantenere il nome file originale :
mv "$fn" "$(date -r "$pathAndFileName" +"%Y-%m-%d_%H-%M-%S")"
Spero che aiuti i niubbi come me!
Denominazione basata sulla data del file system
Nella shell Linux:
for f in *.jpg
do
mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done
Spiegazione :
-
for f in *.jpg do
Questo avvia il ciclo su tutti i file jpeg. Una caratteristica di questo è che funzionerà con tutti i nomi di file, anche quelli con spazi, tabulazioni o altri caratteri difficili nei nomi.
-
mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
Questo rinomina il file. Utilizza il
-r
opzione che indicadate
per visualizzare la data del file anziché la data corrente. La specifica+"%Y%m%d_%H%M%S"
dicedate
per formattarlo come specificato.Il nome del file,
$f
, è racchiuso tra virgolette doppie ovunque venga utilizzato. Questo assicura che nomi di file strani non causino errori.Il
-n
opzione amv
dice a move di non sovrascrivere mai un file esistente. -
done
Questo completa il ciclo.
Per un uso interattivo, potresti preferire che il comando sia tutto su una riga. In tal caso, usa:
for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done
Denominazione basata sulla data di creazione EXIF
Per denominare il file in base alla data di creazione EXIF (invece della data del file system), abbiamo bisogno di exiftool
o equivalente:
for f in *.jpg
do
mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done
Spiegazione :
Quanto sopra è abbastanza simile ai comandi per la data del file ma con l'uso di exiftool
e awk
per estrarre l'immagine EXIF Create Date.
-
Il
exiftool
comando fornisce la data in un formato come:$ exiftool -d "%Y%m%d_%H%M%S" -CreateDate sample.jpg Create Date : 20121027_181338
La data effettiva che vogliamo è il quarto campo nell'output.
-
Passiamo il
exiftool
output aawk
in modo che possa estrarre il campo che vogliamo:awk '{print $4".jpg"}'
Questo seleziona il campo della data e aggiunge anche il
.jpg
estensione.
Prova questo
for file in `ls -1 *.jpg`; do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.jpg; mv $file $name; done
Anche se potrebbe esserci un modo più semplice.