Первое правило запрещает родительский узел (концентраторы 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'"
-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", и передает результат в качестве дополнительных аргументов в find
.
Это не удается, потому что * [0-9] *
является глобусом , а не регулярным выражением . В globs *
означает «0 или более символов». Однако в регулярных выражениях *
означает «0 или более того, что стоит перед *». Другими словами, *
является квантификатором
и имеет значение, только если он что-то количественно определяет.
Таким образом, регулярное выражение, которое соответствует 0 или более символам, а затем 0 или более числам, равно . * [0-9] *
. Кроме того, при использовании -regex
с find
регулярное выражение сопоставляется со всем фрагментом файла, поэтому вы должны это учитывать. Собирая все это вместе, вы ищете:
find /path/to/dir -regex '.*/[a-z][a-z]-[1-9].*'
Наконец, вы всегда должны цитировать такие конструкции, передавая их для поиска. Если вы этого не сделаете, оболочка развернет их (так *
станет списком всех файлов и каталогов в вашем текущем каталоге) перед передачей их в find
.