regex по дате - все файлы кроме сегодняшних

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

regex по дате - все файлы кроме сегодняшних

Сообщение Stauffenberg »

Всем привет.

Подскажите как написать regex на bash, который выбирал бы все файлы по шаблону, исключая сегодняшние (те, которые были созданы в тот же день, когда мы будем запускать bash). Этот парсер будет использьзоваться как один из параметров для другой программы, поэтому тут есть один момент: парсер должен быть однострочный и нужно быть осторожней с пробелами, чтобы часть парсера не интерпретировалась как следующий параметр программы.

log_2019-09-06_10_stdout.log
log_2019-09-17_19_stdout.csv
log_2019-09-18_22_stderr.log
log_2019-09-18_22_stdout.csv

Парсер, запущенный сегодня, т.е. 18.09, должен показать только последние два файла.

Вот этот код date --iso-8601 | cut -d "-" -f 3 покажет сегодняшнее число, а это выберет все сегодняшние файлы log_2019-09-`date --iso-8601 | cut -d "-" -f 3`*. Мне нужно наоборот - все файлы кроме сегодняшних.

Тут есть еще один момент - regex проходится по шаблону и сравнивает каждый символ. Как только я подставляю восклицательный знак, чтобы игнорировать 18, первый символ - единица - перекрывает все числа, начинающиеся с единицы, т.е. 17 (в нашем примере) он мне тоже не показывает. Получается, надо использовать логическое И и сравнивать поотдельности оба символа...
В общем, я тут задумался, что пошел куда-то не туда и подумал, что тут наверняка есть ребята, которые сильнее меня в bash и подскажут более короткий и правильный способ.

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

Благодарю за любую помощь ;)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: regex по дате - все файлы кроме сегодняшних

Сообщение Bizdelnick »

find . ! -name "*_$(date --iso-8601)_*"

А регулярки тут и не нужны.
Добавлено (13:31):
А если я неправильно понял, и рядом лежат ещё какие-то файлы, которые надо отсеять, то как-то так:
find . -regextype posix-extended -regex '\./log_[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}_.*' ! -name "log_$(date --iso-8601)*"
Последний раз редактировалось Bizdelnick 18.09.2019 14:13, всего редактировалось 1 раз.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: regex по дате - все файлы кроме сегодняшних

Сообщение s.xbatob »

bash и вообще любой shell такого не умеет. Эта забота не его. find вам в помощь. Как его применить вам уже посоветовалию
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: regex по дате - все файлы кроме сегодняшних

Сообщение Bizdelnick »

s.xbatob писал:
18.09.2019 14:12
bash и вообще любой shell такого не умеет.
Ну не то чтобы совсем не умеет, но в однострок сложновато будет уместить, да и бессмысленно при наличии более эффективных инструментов.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: regex по дате - все файлы кроме сегодняшних

Сообщение Stauffenberg »

Bizdelnick писал:
18.09.2019 13:23
find . ! -name "*_$(date --iso-8601)_*"

А регулярки тут и не нужны.
Добавлено (18.09.2019 13:31):
А если я неправильно понял, и рядом лежат ещё какие-то файлы, которые надо отсеять, то как-то так:
find . -regextype posix-extended -regex '\./log_[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}_.*' ! -name "log_$(date --iso-8601)*"
Большое спасибо. Сам не понимаю как я мог забыть про find(1). С него и надо было начинать...
Нашел более простое решение: find -atime +0 | grep log_*
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: regex по дате - все файлы кроме сегодняшних

Сообщение Bizdelnick »

Stauffenberg писал:
18.09.2019 17:29
Нашел более простое решение: find -atime +0 | grep log_*
Во-первых, в регулярке ошибка, а во-вторых, * в шелл-скриптах обязательно надо экранировать.
Но проще будет find -atime +0 -name 'log_*'
Только учтите, что в случае копирования файлов даты собьются.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить