Не удается правильно использовать find -name

#regex #linux #bash #find #regex-greedy

#регулярное выражение #linux #bash #Найти #регулярное выражение -жадное

Вопрос:

  1. Кто-нибудь может привести несколько примеров использования find -name "pattern" команды, особенно с "pattern" s, где используется ‘?‘ как часть регулярного выражения. Поскольку мои шаблоны совпадают с онлайн-регулярными выражениями, bit не работает в утилите ‘find’.

  2. Кто-нибудь может объяснить, что это значит в руководстве по поиску с примерами?

Метасимволы ( *', ?’, и []') match a .’ в начале базового имени (это изменение в findutils-4.2.2; см. раздел СООТВЕТСТВИЕ СТАНДАРТАМ ниже)

  1. Как правильно использовать "?" в find -name "pattern" ? Я прав, что "?" означает «ноль или один символ»?

Ответ №1:

Со find справочной страницы:

-в основе имени файла лежит шаблон name (путь с удаленными ведущими каталогами), соответствующий шаблону shell pattern.

Ответом на ваш вопрос является определение термина шаблон оболочки, который объясняется здесь (вы также найдете объяснение на странице руководства вашей оболочки):

* Соответствует нулю или более символов.

? Соответствует любому символу.

[строка] Соответствует ровно одному символу, который является членом строки string. Это называется символьным классом. В качестве сокращения строка может содержать диапазоны, состоящие из двух символов с тире между ними. Например, класс ‘[a-z0-9_]’ соответствует строчной букве, цифре или символу подчеркивания. Вы можете отменить класс, поместив ‘!’ или ‘^’ сразу после открывающей скобки. Таким образом, ‘[^A-Z @]’ соответствует любому символу, кроме заглавной буквы или знака at.

Удаляет специальное значение символа, который следует за ним. Это работает даже в символьных классах.


Примеры:

Я надеюсь, что следующие примеры объясняют разницу между ? и * .

 touch foobar
touch fobar

# * matches the tail (finds 'foobar')
find -name 'foo*'

# * matches the head (finds both files)
find -name '*bar'

# ? matches the 'f' at start (finds 'foobar')
find -name '?oobar'

# ? DON'T matches the whole tail (finds nothing)
find -name 'foo?'

# ? matches the second 'o' (finds 'foobar')
find -name 'fo?bar'

# ? matches one instance of any character after the 'f' (finds 'fobar')
find -name 'f?bar'

# * matches both zero or more characters after 'o' (finds both files)
find -name 'fo*bar'
  

В этом примере показано, как использовать оператор скобок [string] :

 touch fobar
touch fubar

# matches a single 'o' OR 'u' (finds both files)
find -name 'f[ou]bar'
  

Конечно, вы можете смешивать различные метасимволы:

 # Finds every file starting with an 'o' or 'u' (included files named 'o' or 'u')
find -name '[ou]*'

# Finds every file starting with an 'o' or 'u' (excluded files named 'o' or 'u')
find -name '[ou]?*'
  

Комментарии:

1. Для ясности, fo*bar совпадения fo , за которыми следует ноль или более символов любого вида, за которыми следует bar . Это * не связано с предыдущим o , как и в регулярном выражении.

2. Спасибо за разъяснение @chepner. Я отредактировал эту часть, чтобы сделать ее более понятной.

Ответ №2:

  1. один пример:

    [root@v3 ~]# find -name ‘op?n *.sh’

    ./openerp-install.sh

    [root@v3 ~]# find -name ‘op?en*.sh’

    [root@v3 ~]#

  2. базовое имя — это имя файла без указания пути, например, если полный путь к файлу «/usr/share/pkgconfig/gnome-icon-theme.pc», то базовым именем этого файла будет «gnome-icon-theme.pc»

  3. «?» в шаблоне поиска означает «ровно один символ», а не «ноль или один символ»