Я видел этот ответ .
Вы должны рассмотреть возможность использования inotifywait, например:
inotifywait -m /path -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" # do something with the file done
Мой вопрос заключается в том, что приведенный выше скрипт следит за каталогом для создания файлов любого типа, но как мне изменить inotifywait
команду, чтобы она сообщала только тогда, когда файл определенного типа / расширения создан (или перемещен в каталог) - например, он должен сообщить, когда любой .xml
файл создан.
ЧТО Я ПОПЫТАЛ
Я выполнил inotifywait --help
команду и прочитал параметры командной строки. Он имеет --exclude <pattern>
и --excludei <pattern>
команды для ИСКЛЮЧЕНИЯ файлов определенных типов (с помощью regEx), но мне нужен способ ВКЛЮЧИТЬ только файлы определенного типа / расширения.
shell-script
shell
filesystems
monitoring
inotify
Застенчивый
источник
источник
path
выше, вероятно, не лучшее имя переменной, если вы хотите поиграть с этим первым в оболочке. Если вы используете его, то вы не сможете использовать команды и все остальное, поскольку это в основном просто переопределило стандартPATH
. Поэтому я рекомендую использовать альтернативное имя var, например,fpath
вместо. т.е.while read fpath action file
любая стандартная команда, обычно доступная из вашей оболочки, все равно будет.Ответы:
Обратите внимание, что это непроверенный код, поскольку у меня нет доступа к нему
inotify
прямо сейчас. Но что-то похожее на это должно сработать:источник
incron
(я надеюсь, что нет).inotify
либо сnohup
или запустить его с помощью пользовательской Systemd службы. Чаще всего последний.Используйте двойной минус:
Это будет включать только файлы JavaScript
источник
inotifywait
а не генерирует огромный вывод для всех файлов и фильтрует впоследствии (как в другом ответе). Не пробовал, но думаю, что это будет работать немного быстрее.--exclude
вход для просмотра.ext
файлов. Это выполняется только один раз или в цикле?inotifywait -m --exclude "[^.][^e][^x][^t]$" /home/jonas/Skrivbord/test -e create -e moved_to | while read path action file; do echo "The file '$file' appeared in directory '$path' via '$action'" done
Я уверен, что регулярное выражение может быть оптимизировано, но этот ребенок работает :)Хотя двойной отрицательный подход предыдущего ответа является хорошей идеей, поскольку (как отметил TMG) он действительно переносит работу по фильтрации
inotifywait
, но он не верен.Например, если файл заканчивается,
as
он не будет совпадать,[^j][^s]$
потому что последняя букваs
не совпадает[^s]
, поэтому он не будет исключен.В логических терминах, если
S
это утверждение:и
J
это утверждение:тогда значение
--exclude
параметра должно семантически приравнятьсяnot(J and S)
, что по законам де Моргана являетсяnot(J) or not(S)
.Другая потенциальная проблема заключается в том
zsh
, что in ,$path
является встроенной переменной, представляющей эквивалент массива$PATH
, поэтомуwhile read path ...
строка полностью испортится$PATH
и приведет к тому, что все станет неисполнимым из оболочки.Поэтому правильный подход:
Обратите внимание на то,
.
что необходимо после того,[^j]
чтобы убедиться, что сопоставление применяется в предпоследней позиции, а также что|
символ (представляющий логическое ИЛИ, упомянутое выше) не должен быть экранирован здесь, потому что--exclude
принимает расширенные регулярные выражения POSIX.источник