найти: регулярное выражение в имени

найти: регулярное выражение в имени

предположим, я пишу:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

Мне кажется, что эта команда должна работать. Я перебрал различные параметры regextype и различные форматы regex, но не могу заставить этот тип regex работать через find. Есть ли что-то простое, в чем я ошибаюсь относительно find и анализатора регулярных выражений?

решение1

Find -nameне принимает регулярные выражения (это использовалось в оригинальной версии вопроса). Он принимает подстановки оболочки, а это недопустимая подстановка оболочки. Вы хотите использовать тест -regex, но также должны указать ему использовать расширенные регулярные выражения или любую другую разновидность, которая понимает нотации {N}и foo|bar. Наконец, в отличие от -name, -regexтест смотрит на полное имя пути, поэтому вам нужно что-то вроде этого:

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

Если вы хотите использовать -name, вы можете сделать:

find . \( \
       -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
    -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
       \) -printf "%f\n"

решение2

Другой вариант — это fdинструмент:

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

решение3

Если у вас есть разумные имена файлов (по крайней мере в этой папке), вы можете запустить что-то вроде этого

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

Таким образом, вы сможете воспользоваться различными опциями grep.

Связанный контент