Переименуйте файлы JPG в соответствии с созданной датой
Я хочу переименовать все файлы в определенном каталоге. Переименование их к дате создания.
Так что если мой файл - Image1.jpg, он должен переименовать в нечто вроде "Jan 16 12:09:42 2011.jpg"
Я хочу сделать это через командную строку. Я пытался:
stat -f %SB Image0100.jpg
Но как я могу объединить это с командой mv
? И как я буду повторять stat
и mv
через все файлы?
Или есть простые способы переименовать все файлы с их созданием даты?
Ответы
Ответ 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