Как переименовать фото в соответствии с датой-временем файла или съёмки

Для фотографий (из EXIF или даты файла)

Фотографии отличаются от "просто файлов" тем, что у них может быть внутри дополнительная информация - EXIF. Для переименования всех фотографий в текущей папке из невразумительных имен IMAGE01234.jpg во что-то наподобие 2012-08-12-235516.jpg делаем так:

#!/bin/bash
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}

jhead -n ищет данные сначала в EXIF, и если этой информации там нет, то берет за основу дату-время файла.

Файлы любых других типов (по дате файла)

Для любых других файлов (логов и так далее) используем ls -l (приведенному скрипту надо указать имя файла):

#!/bin/bash
mv "$file" `ls -l "$1" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg

Если файлов много, то то же самое в цикле

#!/bin/bash
for file in *.jpg *.jpeg *.JPG *.JPEG; do
    mv "$file" `ls -l "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.jpg
done

Мой текущий ~/bin/dts полностью

#!/bin/bash
## Rename all known media files to their DTS (date/time stamp)
## ATTN: renames ALL files in current directory, no backups or ability to restore old filename
## -- JPEG --
jhead -n%Y-%m-%d-%H%M%S *.{jpg,jpeg,JPG,JPEG}
## -- PNG  --
for file in *.png *.PNG; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.png
done
## -- 3GP --
for file in *.3gp; do
    mv "$file" `ls -l --full-time "$file" | awk '{ print $6"_"$7 }' | tr ':' '-'`.3gp
done
Tags: