Почему find не находит мой каталог ни с -именем, ни с -регулярным выражением

Есть ссылка из /lib/modules/"Kernel -версия" ->/lib64/modules/"Kernel -версия"

Мне не удалось заставить ссылку работать в initrd, поэтому я скопировал ее в каталог /lib64/modules, так как торопился. Существует также зависимость от модуля ptp.

Меня смутило то, что они используют встроенный initrd в файле ядра. Раньше у них был драйвер e1000e в старых версиях systemrescuecd

.
10
26.01.2021, 13:33
3 ответа

find 's -nameпринимает подстановочный шаблон shell/glob/ fnmatch(), а не регулярное выражение.

GNU find's -regexнестандартное расширение -действительно принимает тип regexp (старого стиля emacs по умолчанию ), но это применяется к полному пути (, как и стандартное -path, который также принимает подстановочные знаки ), а не только имя файла (и привязывается неявно)

Таким образом, чтобы найти файлы типа в каталоге , чье имя начинается с machine, вам потребуется:

find. -name 'machine*' -type d

Или:

find. -regextype posix-extended -regex '.*/machine[^/]*' -type d

(для этого конкретного регулярного выражения вам не нужно -regextype posix-extended, так как механизм регулярных выражений по умолчанию также будет работать)

Обратите внимание, что для первого, совпадающего с именем файла, также должен быть допустимый текст в локали, а для второго — полный путь, который должен быть допустимым текстом.

21
18.03.2021, 22:34

Аргумент для -nameочень похож на глобус оболочки, поэтому он неявно связан с началом и концом имени файла, которому он соответствует, и вам нужно *, чтобы указать, что может быть больше:

find. -type d -name 'machine*'

Для ваших альтернатив -regexзадокументировано (см.man find)как "совпадение по всему пути, а не поиск ", также неявно привязанное к началу и концу совпадения, поэтому вам понадобится

find. -type d -regextype posix-extended -regex '(.*/)?machine[^/]*'

Когда вы говорите, что «пробовали также с -name», вы забыли, что для -regexтребуется параметр, поэтому он использовал -nameв качестве этого параметра, а затем подавился неожиданным'^machine'

11
18.03.2021, 22:34

Тест -nameиз findне принимает регулярные выражения, он принимает файловые глобусы. ^не имеет особого значения в globs, поэтому ваша команда ищет каталоги с фактическим именем ^machine. Вам нужно это, чтобы найти все каталоги, имя которых начинается сmachine:

find. -type d -name 'machine*'

Другая ваша попытка не удалась, потому что -regexпохоже на -name. Это не флаг для включения, вам нужно передать ему регулярное выражение в качестве входных данных. Здесь вы ничего не дали,так findжаловался. Также обратите внимание, что тест -regexбудет пытаться сопоставить весь путь, а не только имя. Правильным способом сделать то, что вы хотите, используя тест -regex, будет что-то вроде:

find. -maxdepth 1 -type d -regex '.*/machine.*' 
6
18.03.2021, 22:34

Теги

Похожие вопросы