it-roy-ru.com

linux-Shell: переименование файлов во время создания

Всем доброе утро,

для веб-сайта я хотел бы переименовать файлы (изображения) в папке из «1.jpg, 2.jpg, 3.jpg ...» в «yyyymmdd_hhmmss.jpg» - так что я хотел бы зачитать создание раз набор в этот раз как имена для фото. У кого-нибудь есть идеи, как это сделать, например, с помощью linux-Shell или с imagemagick?

Спасибо!

16
Andre

Наименование на основе даты файловой системы

В оболочке Linux:

for f in *.jpg
do
    mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"
done

Объяснение :

  • for f in *.jpg do

    Это запускает цикл над всеми файлами JPEG. Особенностью этого является то, что он будет работать со всеми именами файлов, даже с пробелами, символами табуляции или другими сложными символами в именах.

  • mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"

    Это переименовывает файл. Он использует параметр -r, который сообщает date для отображения даты файла, а не текущей даты. Спецификация +"%Y%m%d_%H%M%S" указывает date форматировать его так, как вы указали.

    Имя файла $f помещается в двойные кавычки, где бы оно ни использовалось. Это гарантирует, что нечетные имена файлов не вызовут ошибок.

    Параметр -n для mv указывает Move никогда не перезаписывать существующий файл.

  • done

    Это завершает цикл.

Для интерактивного использования вы можете предпочесть, чтобы команда находилась в одной строке. В этом случае используйте:

for f in *.jpg; do mv -n "$f" "$(date -r "$f" +"%Y%m%d_%H%M%S").jpg"; done

Наименование на основе даты создания EXIF

Чтобы присвоить файлу имя на основе даты создания EXIF ​​(вместо даты файловой системы), нам нужен exiftool или эквивалент:

for f in *.jpg
do
    mv -n "$f" "$(exiftool -d "%Y%m%d_%H%M%S" -CreateDate "$f" | awk '{print $4".jpg"}')"
done

Объяснение :

Вышеприведенное очень похоже на команды для даты файла, но с использованием exiftool и awk для извлечения EXIF-образа Create Date Create. 

  • Команда exiftool предоставляет дату в следующем формате:

    $ exiftool -d "%Y%m%d_%H%M%S"  -CreateDate sample.jpg
    Create Date                     : 20121027_181338
    

    Фактическая дата, которую мы хотим, является четвертым полем в выводе. 

  • Мы передаем вывод exiftool в awk, чтобы он мог извлечь нужное нам поле:

    awk '{print $4".jpg"}'
    

    При этом выбирается поле даты, а также добавляется расширение .jpg.

32
John1024

Попробуй это

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

Хотя может быть более простой способ.

1
Ashish Gaur