список имен файлов, хранящихся в текстовом файле, с определенной меткой времени

Используйте / и соответствующее регулярное выражение.

  • Для поиска строки в начале строки используйте в качестве выражения ^string.
  • Для поиска строки в конце строки используйте в качестве выражения string$.

Символы ^и $привязывают выражение к началу и концу строки соответственно.

0
19.12.2019, 11:25
2 ответа

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

В вашем конкретном случае вы можете изменить оператор, как в

grep -E "Dec 18 (1[4-9]|2[0123])"

, но учтите, что для этого требуется GNU grepи синтаксис «расширенных регулярных выражений». Используемый вами синтаксис будет искать литеральную строку {14-23}, которая появится в вашей выходной строке ls.

Кроме того, как общее примечание, синтаксический анализ вывода lsнастоятельно не рекомендуется , так как есть много ловушек, если ваши имена файлов содержат необычные символы или ваши региональные настройки приводят к другим форматам меток времени и т. д. Подход вы выбрали, например полностью зависит от привычки lsотображать отметку времени как Mon DD HH:MMдля времени модификации, которое произошло за последние пол года или около того. Безопаснее использовать, например. findс опцией -mtime(, возможно, вместе с -daystart).

0
28.01.2020, 02:21

Сначала создайте эталонный файл временной метки с правильной 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.

3
28.01.2020, 02:21

Теги

Похожие вопросы