Как достать дату из названия файла?

Рейтинг: 1Ответов: 2Опубликовано: 25.07.2023

Мне с помощью bash скрипта нужно удалять файлы, если они старше чем две недели. Вот пример названия файла bliznetsy_17-07-2023__03-01.dump. Дата создания файла вшита в название (в данном случае дата создания 17.07.2023). Как мне из названия доставать дату создания файла, так что бы скрипт корректно воспринимал эту дату?

Папка с файлами находится на виртуальной машине Linux.

Пробовал вот так, но падает с ошибкой что дата некорректна

#!/bin/bash

backup_folder="/dev/backupsTest"  

# Рассчитываем текущую дату и дату 2 недели назад
current_date=$(date +%s)
two_weeks_ago=$(date -d "2 weeks ago" +%s)

# Перебираем файлы в папке с бэкапами
for file in "$backup_folder"/*; do
  # Получаем дату файла из его имени
  filename=$(basename "$file")
  date_part=$(echo "$filename" | cut -d'_' -f2)
  file_date=$(date -d "${date_part//__/ }" +%s)

  # Проверяем, старше ли файл двух недель и не является ли датой 5, 15 или 25 числа
  if [[ $file_date -lt $two_weeks_ago ]] && ! [[ "${date_part:0:2}" =~ ^(05|15|25)$ ]]; then
    # Удаляем файл
    rm "$file"
    echo "Удален файл: $file"
  fi
done

Ответы

▲ 1

Если я правильно понял что нужно

#Получаем день, месяц, год из переменной filename
IFS='-' read day mm yyyy < <(grep -oP '(?<=_)([0-9]{2}-){2}[0-9]{4}(?=_)' <<< "${filename}")

#Приводим дату к виду, который станет валидным для date текущий локали, получаем секунды
file_date=$(date -d "${yyyy}-${mm}-${day}" +%s)

Если файл имеет имя bliznetsy_17-07-2023__03-01.dump, то в переменную file_date будет записано значение 1689541200


UPD: Если можно использовать awk, то можно выбрать нужные столбцы используя несколько разделителей:

#filename="bliznetsy_17-08-2023__03-01.dump"
file_date=$(date -d `awk -F'[-_]' 'OFS="-" {print $4,$3,$2}' <<< "${filename}"` %s)
#file_date=1692219600 

Важно! Количество нижних подчеркиваний и тире до даты должно быть одинаковым

▲ 1

find все сделает за вас:

find /dev/backupsTest -type f -mtime +14 -delete