Изменить формат даты в именах файлов
Я получаю электронные письма, формат имени файла (Это формат Unix для даты + .report-server
)
1509106656.32538_1.report-server
Теперь у меня есть несколько писем. Я хочу отформатировать все имена файлов с новым форматом даты и времени, как это.
dd-mm-yyyy.report-server
3 ответа
Как насчет этого:
for i in *.report-server; do echo mv "$i" "$(date -d@${i%%.*} +%d-%m-%Y.${i##*.})"; done
Это зацикливается на .report-server
файлы в текущем каталоге и для каждого файла печатает строку вроде
mv 1509106656.32538_1.report-server 27-10-2017.report-server
где вы можете проверить имя файла. Если он делает то, что вы хотите, просто удалите echo
из команды и запустите его, чтобы выполнить переименование.
Будь осторожен! Если у вас будет несколько файлов с одной и той же датой mv
(по умолчанию) будет перезаписывать первые из них. Если вы хотите сохранить (предположительно уникальный) .32538_1
часть, изменить ${i##*.}
в ${i#*.}
в команде. Если ты хочешь mv
спросить перед перезаписью файлов, добавьте -i
вариант.
Вы можете использовать следующий скрипт в качестве подсказки:
#!/bin/bash
for i in *.report-server; do
timestamp=$(echo $i | cut -d. -f1)
output_date=$(date +'%d-%m-%Y' -d @$timestamp)
mv "$i" "${output_date}.report-server"
Вот способ сделать это, используя Perl-based rename
или же prename
(по сути, дубликат Как я могу пакетно преобразовать имена папок из одного формата даты в другой, с разными спецификаторами формата):
$ rename -n -- '
BEGIN{use Time::Piece};
s/(\d{10})\.\d{5}_1/Time::Piece->strptime($1, "%s")->strftime("%d-%m-%Y")/e
' *.report-server
rename(1509106656.32538_1.report-server, 27-10-2017.report-server)
Удалить -n
(или изменить на -v
если вы хотите подробный вывод), когда вы счастливы, что он делает то, что вы хотите.