1

В моем centOS есть много файлов журнала в моей папке /log

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3
/log/log.20120308.error
/log/log.20120308.error.1

Видимо, если я использую команду, как показано ниже

find /log -type f -iregex '.*/'log.20120308'.[0-9]*' -print

Я получу только

/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Я надеюсь получить правильное регулярное выражение, чтобы получить список ниже, но не удалось

/log/log.20120308
/log/log.20120308.1
/log/log.20120308.2
/log/log.20120308.3

Я не мог понять регулярное выражение, чтобы выбрать расширение .1, .2, .3 или пустое

2 ответа2

3
find /log -type f -iregex '.*/'log.20120308'\(\.[0-9]*\)?' -print

? указывает один или ничего, и вы должны экранировать точку (до [0-9], поскольку точка соответствует всему), поэтому, если вы не экранируете точку, вы также получите /log/log.20120308_1 в результате, если это файл существует.

2

Одна версия:

find /log -type f -iregex '.*/'log.20120308'[.0-9]*' -print

Конечно, это также выберет файл с именем /log/log.20120308.. , но я не думаю, что это будет вероятной проблемой.

Другим способом будет использование -o в качестве оператора "или" с экранированными скобками вокруг операндов:

find /log -type f \( -iregex '.*/'log.20120308'.[0-9]*' -o -iregex '.*/'log.20120308 \) -print

О, еще одно обновление для использования -iregex: вы можете просто несколько процитировать свою цитату, поскольку '.*/log.20120308.[0-9]*' выберет то же самое, что и '.*/'log.20120308'.[0-9]*' Соединив это с предложением @ md-gao, вы можете получить эту версию:

find /log -type f -iregex '.*/log.20120308\(\.[0-9]\)?' -print

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .