Изменить формат даты в именах файлов

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

Другие вопросы по тегам