Я получаю электронные письма, формат имени файла такой (Это формат Unix для даты + .report-server
)
1509106656.32538_1.report-server
Теперь у меня есть несколько электронных писем. Я хочу отформатировать все имена файлов с новым форматом даты и времени, подобным этому.
dd-mm-yyyy.report-server
Как насчет этого:
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
, если вы хотите подробный вывод), когда вы счастливы, что он делает то, что вы хотите.