Используйте / и соответствующее регулярное выражение.
^string
. string$
. Символы ^
и $
привязывают выражение к началу и концу строки соответственно.
Использовать grep
для фильтрации временных меток для диапазона допустимых времен непросто, поскольку регулярные выражения предназначены для текстовых шаблонов, а не для числовых сравнений (, см., например,. этот и другие,подобные вопросы ).
В вашем конкретном случае вы можете изменить оператор, как в
grep -E "Dec 18 (1[4-9]|2[0123])"
, но учтите, что для этого требуется GNU grep
и синтаксис «расширенных регулярных выражений». Используемый вами синтаксис будет искать литеральную строку {14-23}
, которая появится в вашей выходной строке ls
.
Кроме того, как общее примечание, синтаксический анализ вывода ls
настоятельно не рекомендуется , так как есть много ловушек, если ваши имена файлов содержат необычные символы или ваши региональные настройки приводят к другим форматам меток времени и т. д. Подход вы выбрали, например полностью зависит от привычки ls
отображать отметку времени как Mon DD HH:MM
для времени модификации, которое произошло за последние пол года или около того. Безопаснее использовать, например. find
с опцией -mtime
(, возможно, вместе с -daystart
).
Сначала создайте эталонный файл временной метки с правильной mtime
временной меткой:
touch -d 2019-12-18T14:00 timestamp
Затем проанализируйте ваш файл и для каждого файла проверьте, является ли файл новее, чем тот timestamp
файл, который мы только что создали:
while IFS= read -r name; do
if [[ /prdusr/rhd/prdoper/opLogDir/$name -nt timestamp ]]; then
printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
fi
done <new1.txt
При этом используется файловый тест -nt
в bash
для проверки метки времени модификации (обратите внимание, что bash
не выполняет этот тест с точностью до -секунды ).
Использование инструментов POSIX:
touch -d 2019-12-18T14:00 timestamp
while IFS= read -r name; do
if [ -n "$( find "/prdusr/rhd/prdoper/opLogDir/$name" -newer timestamp )" ]
then
printf 'Updated: %s\n' "/prdusr/rhd/prdoper/opLogDir/$name"
fi
done <new1.txt
Вместо этого будет выполнен тест с использованием find
, который выведет найденный путь, если имеющийся файл был изменен после файла timestamp
, и оболочка обнаружит вывод как не -пустую строку и звоните printf
.