Переименование файлов JPG в соответствии с датой создания - PullRequest
26 голосов
/ 17 января 2011

Я хочу переименовать все файлы в определенном каталоге. Переименование их в дату их создания.
Поэтому, если мой файл - Image1.jpg, он должен переименоваться во что-то вроде «Jan 16 12:09:42 2011.jpg»
Я хочу сделать это через командную строку. Я пытался:

stat -f %SB Image0100.jpg

Но как мне совместить это с командой mv? И как я буду повторять stat и mv по всем файлам?
Или есть простые способы переименовать все файлы с их датой создания?

Ответы [ 11 ]

55 голосов
/ 14 июля 2012
jhead -n DSCN0382.JPG
DSCN0382.JPG --> 0408-150734.jpg

также может быть задан любой аргумент strftime:

jhead -n%Y%m%d-%H%M%S *.jpg 

Это переименует файлы, соответствующие * .jpg, в формате YYYYMMDD-HHMMSS

jhead -n%Y%m%d-%H%M%S DSCN0382.JPG
DSCN0382.JPG --> 20120408-150734.jpg

см. Такжестраница руководства для множества других интересных вариантов.Например, вы можете исправить (сдвинуть) дату EXIF.Это очень удобно при объединении файлов с разных камер, когда для некоторых камер установлено неверное время.

15 голосов
/ 17 января 2011

Если вы работаете с JPG, который содержит данные EXIF ​​ (т.е. с цифровой камеры), вы можете использовать следующую команду, чтобы получить дату создания вместо стат.

exif -t 0x9003 -m Image0100.jpg

Для запроса, вот команда и вывод. Несколько замечаний:

  • Так как не каждый файл имеет exif-данные, мы хотим проверить, что dst допустимо, прежде чем выполнять остальные команды.
  • В выводе exif есть пробел, который является PITA для имен файлов. Используйте sed для замены на '-'.
  • Обратите внимание, что я использую 'echo' перед mv, чтобы проверить мои сценарии. Когда вы уверены, что все делает правильно, тогда вы можете убрать «эхо» ... вы не хотите оказаться таким, как парень, у которого все файлы сорваны.

Команда

for i in *.jpg; do
  dst=$(exif -t 0x9003 -m $i ) &&
  dst_esc=$(echo $dst | sed 's/ /-/g' ) &&
  echo mv $i $dst_esc.jpg
done

выход

'12379632.jpg' does not contain tag 'DateTimeOriginal'.
mv 15084688.jpg 2003:02:28-21:48:54.jpg
mv 15136312.jpg 2003:03:01-10:36:05.jpg
mv 15137960.jpg 2003:03:01-10:36:38.jpg
mv 15140744.jpg 2003:03:01-10:37:46.jpg
5 голосов
/ 17 января 2011
for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$
1 голос
/ 19 апреля 2014

Если вам, как и мне, приходится гуглить это снова и снова, потому что вы стареете и не можете что-то вспомнить, вы также можете использовать gThumb с включенным пакетным переименователем, который работает хорошо и имеет старое имя -> Предварительный просмотр нового имени.Очень мило.

1 голос
/ 23 декабря 2012

Существует также:

rename -v 's/.JPG/.jpeg/' *.JPG
rename -v 's/.jpeg/.jpg/' *.jpeg
exiv2 -r'RP_%Y%m%d_%H%M%S' rename *.jpg

для примера RP_20120801_063021.jpgЭто работает для Linux Debian (например, Ubuntu).

Команды переименования предназначены для случаев, когда некоторые изображения имеют формат .JPG или .jpeg.Невозможно преобразовать .JPG напрямую в .jpg, поскольку он интерпретируется как один и тот же ...

1 голос
/ 18 января 2011
find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'
1 голос
/ 17 января 2011
$ for i in *; do mv "$i" "`stat -f %SB $i`"; done
1 голос
/ 17 января 2011

Большинство файловых систем POSIX не записывают время создания (и API, конечно, не раскрывает его, даже если оно записано), поэтому вы SOL.

0 голосов
/ 19 мая 2015

Альтернатива perl:

Мне очень нравится короткий шаблон для добавления префикса фиксированной строки с perl:

/bin/ls *.jpg | perl -pe 's/.*/mv "$&" "prefix_$&"/' | sh

Чтобы сделать префикс даты, это немного сложнее.

cat >t.pl

while(<*.jpg>) {
    $mtime = (stat($_))[9];
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
    $year += 1900;
    ++ $mon;
    printf("mv \"%s\" \"%d-%.2d-%.2d-%s\"\n", $_, $year, $mon, $mday, $_)
}

perl t.pl | sh
0 голосов
/ 18 января 2011

Просто используйте exiftool . Вот пример из его документации :

   exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
        Both the directory and the filename may be changed together via the
        "FileName" tag if the new "FileName" contains a '/'.  The example above
        recursively renames all images in a directory by adding a "CreateDate"
        timestamp to the start of the filename, then moves them into new
        directories named by date.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...