Всем привет.
Подскажите как написать 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, который был бы достаточно интеллигентным, чтобы понимать еще и месяца (запущенный первого числа должен смотреть предыдущий месяц) и года.
Благодарю за любую помощь
regex по дате - все файлы кроме сегодняшних
Модераторы: /dev/random, Модераторы разделов
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
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)
"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 по дате - все файлы кроме сегодняшних
find . ! -name "*_$(date --iso-8601)_*"
А регулярки тут и не нужны.
find . -regextype posix-extended -regex '\./log_[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}_.*' ! -name "log_$(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 раз.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Спасибо сказали:
Re: regex по дате - все файлы кроме сегодняшних
bash и вообще любой shell такого не умеет. Эта забота не его. find вам в помощь. Как его применить вам уже посоветовалию
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: regex по дате - все файлы кроме сегодняшних
Ну не то чтобы совсем не умеет, но в однострок сложновато будет уместить, да и бессмысленно при наличии более эффективных инструментов.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
- Stauffenberg
- Сообщения: 2042
- Статус: ☮ PEACE ☮
- ОС: открытая и свободная
Re: regex по дате - все файлы кроме сегодняшних
Большое спасибо. Сам не понимаю как я мог забыть про find(1). С него и надо было начинать...Bizdelnick писал: ↑18.09.2019 13:23find . ! -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 -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)
"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 по дате - все файлы кроме сегодняшних
Во-первых, в регулярке ошибка, а во-вторых, * в шелл-скриптах обязательно надо экранировать.
Но проще будет find -atime +0 -name 'log_*'
Только учтите, что в случае копирования файлов даты собьются.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |