Bash: найти все файлы на основе диапазона дат в именах файлов - PullRequest
1 голос
/ 24 марта 2020

У меня есть каталог с большим количеством файлов, названных в следующем формате даты:

YYYYMMDDHH00

с номером com-порта в конце. Например,

202003240200COM10.txt
202003240300COM10.txt
202003240400COM10.txt

Эти файлы генерируются скриптом каждый час, а имена всегда в одном и том же формате.

Я хочу использовать команду "find" для возврата списка файлы в диапазоне дат, который я указываю в сценарии, например, все файлы между «1 часом go» и «1 месяцем go». Этот сценарий будет запускаться в произвольное время, и я всегда хочу, чтобы он выполнял поиск в этом диапазоне дат относительно текущей даты, поэтому я не хочу, чтобы какие-либо даты были жестко закодированы.

Я могу получить дату за 1 час go и 3 месяца go с использованием команды "date" следующим образом:

bash-4.4$ date --date "1 hour ago" +%Y%m%d%H00
202003241500
bash-4.4$ date --date "1 month ago" +%Y%m%d%H00
202002241600

Но я изо всех сил пытаюсь получить это в команде "find" правильно. Я пробовал следующее:

for currentfile in *.txt
do
    filedate=${currentfile:0:12}
        file_date=$(date +%s -d "${filedate:0:8}${filedate:8:2}${filedate:10:2}${filedate12:2}")
        start_date=$(date +%s -d "1 month ago")
        end_date=$(date +%s -d "1 hour ago")

        if [[ $file_date -ge $start_date && $file_date -le $end_date ]]; then
                echo $currentfile
        fi
done

Но вывод на консоль - просто поток этих ошибок, по-видимому, один для каждого файла:

date: invalid date 201703190300
date: invalid date 201703190400
date: invalid date 201703190500
date: invalid date 201703190600
date: invalid date 201703190700
date: invalid date 201703190800
date: invalid date 201703190900
date: invalid date 201703191000
date: invalid date 201703191100
date: invalid date 201703191200
date: invalid date 201703191300
date: invalid date 201703191400
date: invalid date 201703191500
date: invalid date 201703191600
date: invalid date 201703191700
date: invalid date 201703191800
date: invalid date 201703191900

Пожалуйста, помогите:)

Ответы [ 2 ]

1 голос
/ 24 марта 2020

date -d ожидает пробел между датой и временем. «CO» не является допустимой частью метки времени, поэтому удалите ее (в исходном коде была опечатка, которая привела к неустановленной переменной) и разделите часы и минуты двоеточиями:

file_date=$(date +%s -d "${filedate:0:8} ${filedate:8:2}:${filedate:10:2}")

Я создал тестовые файлы, используя

touch 20200{1,2,3,4}2{3,4,5}0200COM{1,2,3}0.txt 

Запустив следующий скрипт

#!/bin/bash

start_date=$(date +%s -d "1 month ago")
end_date=$(date +%s -d "1 hour ago")

for currentfile in *.txt ; do
    file_date=$(date +%s -d "${currentfile:0:8} ${currentfile:8:2}:${currentfile:10:2}")

    if [[ $file_date -ge $start_date && $file_date -le $end_date ]]; then
        echo $currentfile
    fi
done

были напечатаны только правильные:

202002250200COM10.txt
202002250200COM20.txt
202002250200COM30.txt
202003230200COM10.txt
202003230200COM20.txt
202003230200COM30.txt
202003240200COM10.txt
202003240200COM20.txt
202003240200COM30.txt

Как правильно отмечено в комментариях Léa Gris , вы можете напрямую использовать формат ГГГГММДЧчмм и сравнивать временные метки в виде строк. Таким образом, вам вообще не нужно вызывать date внутри l oop:

#!/bin/bash

start_date=$(date +%Y%m%d%H%M -d "1 month ago")
end_date=$(date +%Y%m%d%H%M -d "1 hour ago")

for currentfile in *.txt ; do
    file_date=${currentfile:0:12}
    if [[ ! $file_date < $start_date && ! $file_date > $end_date ]]; then
        echo $currentfile
    fi
done

Обратите внимание, что оператор >= не существует, поэтому мы должны использовать отрицательный <.

0 голосов
/ 24 марта 2020

Поскольку на этот вопрос уже есть ответ, я мог бы предложить альтернативный подход, который не основан на правильных именах файлов. Вместо этого вы можете просто прочитать метаданные ваших файлов и распечатать их соответственно. Первое свидание является более поздним.

find . -mtime $(date +%s -d "1 hour ago") -mtime $(date +%s -d "1 month ago")

Это может быть более надежным и работать и для других приложений ведения журналов.

...