Ответ 1
Я пробовал (?!) вещь
Эта вещь называется негативным взглядом и не поддерживается POSIX ERE.
Итак, вам нужно сделать это сложным способом, т.е. сопоставить все, что вы хотите исключить.
например.
\.(txt|xml)
и т.д.
Я пытаюсь использовать inotifywait
для просмотра всех .js файлов в моей директории ~/js
; как форматировать мое регулярное выражение в следующей команде?
$ inotifywait -m -r --exclude [REGEX HERE] ~/js
Регулярное выражение - в соответствии с man-страницей должно иметь расширенное регулярное выражение POSIX - должно соответствовать всем файлам, кроме тех, что заканчивается на .js ", поэтому эти файлы могут быть исключены с помощью опции --exclude
.
Я пробовал поиск (?!), но в этом случае он не работает. Любые идеи или обходные пути? Большое спасибо за вашу помощь по этой проблеме.
Я пробовал (?!) вещь
Эта вещь называется негативным взглядом и не поддерживается POSIX ERE.
Итак, вам нужно сделать это сложным способом, т.е. сопоставить все, что вы хотите исключить.
например.
\.(txt|xml)
и т.д.
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
Я разместил здесь патч, который добавляет опции --include и --includei, которые работают как отрицания --exclude и --excludei:
https://github.com/browndav/inotify-tools/commit/160bc09c7b8e78493e55fc9f071d0c5575496429
Очевидно, вам придется перестроить inotifytools, и это относительно непроверено, но, надеюсь, он может подключиться к mainline или поможет кому-то, кто приходит через это сообщение позже.
Убедитесь, что вы указываете команду regex, если вы используете символы, относящиеся к оболочке (включая ()
).
Пока это работает:
inotifywait --exclude \.pyc .
это не:
inotifywait --exclude (\.pyc|~) .
Вы должны процитировать все регулярное выражение:
inotifywait --exclude '.*(\.pyc|~)' .
Вы можете получить большую часть этого с помощью --exclude '\.[^j][^s]'
, чтобы игнорировать файлы, если они не содержат .js
в какой-то момент в имени файла или пути. Если вы объедините его с -r
, то он будет работать с произвольными уровнями вложенности.
Только недостаток - это такие имена файлов, как test.js.old
, и все файлы внутри каталога с именем example.js/
также будут просмотрены, но это, вероятно, несколько маловероятно.
Возможно, вы можете расширить это регулярное выражение, чтобы исправить это, но лично я не думаю, что недостатки - достаточно большая сделка, о которой нужно беспокоиться.
Начиная с версии 3.20.1, inotifywait включает опции --include
и --includei
.
Чтобы увидеть их, запустите inotifywait --help
. По какой-то причине они не задокументированы на страницах руководства.