inotifywait - исключить форматирование регулярных выражений - PullRequest
11 голосов
/ 30 октября 2011

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

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

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

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

Ответы [ 5 ]

8 голосов
/ 10 июля 2016

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
7 голосов
/ 30 октября 2011

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

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

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

например.

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

3 голосов
/ 18 октября 2013

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

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

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

1 голос
/ 31 августа 2016

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

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

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

1 голос
/ 03 февраля 2016

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

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

inotifywait --exclude \.pyc .

это не так:

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

Вы должны заключить в кавычки все регулярное выражение:

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