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