Подтвердить что ты не робот

Переименуйте файлы JPG в соответствии с созданной датой

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

stat -f %SB Image0100.jpg

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

4b9b3361

Ответ 1

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. Это очень удобно при слиянии файлов с разных камер, когда какая-то камера имеет неправильное время.

Ответ 2

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

exif -t 0x9003 -m Image0100.jpg

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

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

Command

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

Ответ 3

for file in *jpg
do
 newfile=$(date "+%b %d %H:%M:%S%Y $file" -d "$(stat -c "%y" $file)")
 mv "$file" "$newfile"
done$

Ответ 4

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

Ответ 5

$ for i in *; do mv "$i" "`stat -f %SB $i`"; done

Ответ 6

find . -type f | xargs stat -f "mv %%N \"%%SB.jpg\"" | awk -F \; '{system $1;}'

Ответ 7

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

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. Это работает для Debian Linux (например, Ubuntu).

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

Ответ 8

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

Ответ 9

В MacOS X 10.6.6 с Bash (и, я думаю, с оболочкой Korn) это работает с именами файлов с пробелами в них:

echo > "x y"
for file in *
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S' "$file")
    mv "$file" "$x"
done

Он также использует обозначения, полученные из ISO 8601, для даты и времени. Ясно, что если два файла имеют одинаковое время модификации, последний из этих файлов в алфавитном порядке является единственным, который выживет. Это также теряет любой суффикс. Если вы имеете дело с файлами ".jpg", вы, вероятно, захотите использовать:

echo > "x y,jpg"
for file in *.jpg
do
    x=$(stat -f '%SB' -t '%Y%m%d.%H%M%S.jpg' "$file")
    mv "$file" "$x"
done

Поскольку имя вывода ($ x) в нем не содержит пробелов, в команде перемещения нет необходимости в кавычках вокруг "$ x", но их присутствие непротиворечиво.

Ответ 10

Просто используйте 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.

Ответ 11

Альтернатива 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