Поиск файлов в каталоге

  • Первое правило запрещает родительский узел (концентраторы usb, порты usb,... устройствам usb). Помните, что sysfs - это дерево.

  • Вы должны нацелиться на листья (USB-устройства).

  • Вместо нескольких правил и попыток управлять с помощью GOTO, вы можете использовать одно правило.

Проверьте это (пример имени устройства на моей текущей машине: 2-1.2:1.0):

ACTION=="add", KERNEL=="[0-9]-[0-9].[0-9]:[0-9].[0-9]", SUBSYSTEMS=="usb", ATTR{manufacturer}!="SanDisk", RUN+="/bin/sh -c 'echo 0 >/sys$DEVPATH/authorized'"
3
17.08.2016, 11:35
2 ответа

-regex соответствует всему пути к файлу (а не только имени) и привязан по умолчанию ( ^ и $ неявно).

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

find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'

Для имен файлов, начинающихся с 2 буквы, дефис и цифра от 1 до 9 и содержат «привет».

С регулярными выражениями, а здесь с FreeBSD / OS / X find , это должно быть:

find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'

Вам понадобится [^ /] * вместо . * в противном случае, это будет соответствовать, например, на ./ aa-9 / hello / foo / bar .

В любом случае find

* hello * не делает того, что вы думаете. Оболочка расширяет этот глобус * hello * до списка не скрытых файлов или каталогов в текущем каталоге, имя которого содержит "hello", и передает результат в качестве дополнительных аргументов в find .

3
27.01.2020, 21:15

Это не удается, потому что * [0-9] * является глобусом , а не регулярным выражением . В globs * означает «0 или более символов». Однако в регулярных выражениях * означает «0 или более того, что стоит перед *». Другими словами, * является квантификатором и имеет значение, только если он что-то количественно определяет.

Таким образом, регулярное выражение, которое соответствует 0 или более символам, а затем 0 или более числам, равно . * [0-9] * . Кроме того, при использовании -regex с find регулярное выражение сопоставляется со всем фрагментом файла, поэтому вы должны это учитывать. Собирая все это вместе, вы ищете:

find /path/to/dir -regex '.*/[a-z][a-z]-[1-9]‌​.*'

Наконец, вы всегда должны цитировать такие конструкции, передавая их для поиска. Если вы этого не сделаете, оболочка развернет их (так * станет списком всех файлов и каталогов в вашем текущем каталоге) перед передачей их в find .

2
27.01.2020, 21:15

Теги

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