Inotifywait - исключить форматирование шаблона регулярных выражений

Я пытаюсь использовать inotifywait для просмотра всех .js файлов в моей директории ~/js; как форматировать мое регулярное выражение в следующей команде?

$ inotifywait -m -r --exclude [REGEX HERE] ~/js

Регулярное выражение - в соответствии с man-страницей должно иметь расширенное регулярное выражение POSIX - должно соответствовать всем файлам, кроме тех, что заканчивается на .js ", поэтому эти файлы могут быть исключены с помощью опции --exclude.

Я пробовал поиск (?!), но в этом случае он не работает. Любые идеи или обходные пути? Большое спасибо за вашу помощь по этой проблеме.

Ответ 1

Я пробовал (?!) вещь

Эта вещь называется негативным взглядом и не поддерживается POSIX ERE.

Итак, вам нужно сделать это сложным способом, т.е. сопоставить все, что вы хотите исключить.

например.

\.(txt|xml) и т.д.

Ответ 2

inotifywait не имеет опции включения, а расширенные регулярные выражения POSIX не поддерживают отрицание. (Ответил FailedDev)

Вы можете исправить инструменты inotify, чтобы получить опцию --include. Но вам нужно собрать и сохранить его самостоятельно. (Ответил browndav)

Более быстрое обходное решение использует grep.

$ inotifywait -m -r ~/js | grep '\.js$'

Но будьте осторожны с буферизацией grep, если вы передаете вывод другим командам. Добавьте --line-buffered, чтобы он работал с while read. Вот пример:

$ inotifywait -m -r ~/js | grep '\.js$' --line-buffered |
    while read path events file; do
      echo "$events happened to $file in $path"
    done

Если вы хотите посмотреть уже существующие файлы, вы также можете использовать find для создания списка файлов. Он не будет просматривать вновь созданные файлы.

$ find ~/js -name '*.js' | xargs inotifywait -m

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

$ inotifywait -m ~/js/*.js

Ответ 3

Я разместил здесь патч, который добавляет опции --include и --includei, которые работают как отрицания --exclude и --excludei:

https://github.com/browndav/inotify-tools/commit/160bc09c7b8e78493e55fc9f071d0c5575496429

Очевидно, вам придется перестроить inotifytools, и это относительно непроверено, но, надеюсь, он может подключиться к mainline или поможет кому-то, кто приходит через это сообщение позже.

Ответ 4

Убедитесь, что вы указываете команду regex, если вы используете символы, относящиеся к оболочке (включая ()).

Пока это работает:

inotifywait --exclude \.pyc .

это не:

inotifywait --exclude (\.pyc|~) .

Вы должны процитировать все регулярное выражение:

inotifywait --exclude '.*(\.pyc|~)' .

Ответ 5

Вы можете получить большую часть этого с помощью --exclude '\.[^j][^s]', чтобы игнорировать файлы, если они не содержат .js в какой-то момент в имени файла или пути. Если вы объедините его с -r, то он будет работать с произвольными уровнями вложенности.

Только недостаток - это такие имена файлов, как test.js.old, и все файлы внутри каталога с именем example.js/ также будут просмотрены, но это, вероятно, несколько маловероятно.

Возможно, вы можете расширить это регулярное выражение, чтобы исправить это, но лично я не думаю, что недостатки - достаточно большая сделка, о которой нужно беспокоиться.

Ответ 6

Начиная с версии 3.20.1, inotifywait включает опции --include и --includei.

Чтобы увидеть их, запустите inotifywait --help. По какой-то причине они не задокументированы на страницах руководства.