Есть ли на Mac такая команда, как “watch" или “inotifywait”?
Вопрос
Я хочу просмотреть папку на моем Mac (Snow Leopard), а затем выполнить скрипт (указав ему имя файла того, что только что было перемещено в папку (в качестве параметра...x.sh "имя файла")).
У меня есть сценарий, полностью написанный на bash (x.sh ), который переместит некоторые файлы и другие материалы при вводе $ 1, мне просто нужно, чтобы OSX давала мне имя файла при перемещении / создании новых файлов / папок в каталог.
Есть ли такая команда?
Решение
fсвотч
fсвотч это небольшая программа, использующая Mac OS X FSEvents API для мониторинга каталога.Когда получено событие о любом изменении в этом каталоге, указанная команда командной строки
выполняется с помощью /bin/bash
Если вы используете GNU / Linux,
вводящий часы (часть
inotify-tools
package в большинстве дистрибутивов) обеспечивает аналогичную
функциональность.
Обновить: fswatch
теперь может использоваться на многих платформах, включая BSD, Debian и Windows.
Синтаксис / Простой пример
Новый способ, позволяющий отслеживать несколько путей - для версии 1.x и выше:
fswatch -o ~/path/to/watch | xargs -n1 -I{} ~/script/to/run/when/files/change.sh
Примечание:Число, выведенное с помощью
-o
будут добавлены в конецxargs
команда, если бы не-I{}
.Если вы все же решите использовать этот номер, разместите{}
в любом месте вашего подчинения.
Более старый способ для версии 0.x:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
Установка с помощью Homebrew
По состоянию на 9/12/13 он был добавлен обратно в домашнее пиво - ура!Итак, обновите свой список формул (brew update
) и тогда все, что вам нужно сделать, это:
brew install fswatch
Установка без домашнего пивоварения
Введите эти команды в Terminal.app
cd /tmp
git clone https://github.com/alandipert/fswatch
cd fswatch/
make
cp fswatch /usr/local/bin/fswatch
Если у вас нет c
компилятор в вашей системе вам может потребоваться установить Xcode или инструменты командной строки Xcode - оба бесплатны.Однако, если это так, вам, вероятно, следует просто посмотрите на homebrew.
Дополнительные опции для fswatch
версия 1.x
Usage:
fswatch [OPTION] ... path ...
Options:
-0, --print0 Use the ASCII NUL character (0) as line separator.
-1, --one-event Exit fsw after the first set of events is received.
-e, --exclude=REGEX Exclude paths matching REGEX.
-E, --extended Use exended regular expressions.
-f, --format-time Print the event time using the specified format.
-h, --help Show this message.
-i, --insensitive Use case insensitive regular expressions.
-k, --kqueue Use the kqueue monitor.
-l, --latency=DOUBLE Set the latency.
-L, --follow-links Follow symbolic links.
-n, --numeric Print a numeric event mask.
-o, --one-per-batch Print a single message with the number of change events.
in the current batch.
-p, --poll Use the poll monitor.
-r, --recursive Recurse subdirectories.
-t, --timestamp Print the event timestamp.
-u, --utc-time Print the event time as UTC time.
-v, --verbose Print verbose output.
-x, --event-flags Print the event flags.
See the man page for more information.
Другие советы
Вы можете использовать запуск для этой цели.Launchd можно настроить на автоматический запуск программы при изменении пути к файлу.
Например, следующий файл конфигурации launchd запустит программу. /usr/bin/logger
когда папка рабочего стола моей учетной записи изменяется:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>logger</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/logger</string>
<string>path modified</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Users/sakra/Desktop/</string>
</array>
</dict>
</plist>
Чтобы активировать список конфигурации, сохраните его в папке LaunchAgents в папке библиотеки под именем «logger.plist».
Затем из оболочки вы можете использовать команду launchctl
чтобы активировать logger.plist, выполнив:
$ launchctl load ~/Library/LaunchAgents/logger.plist
Папка рабочего стола теперь контролируется.Каждый раз, когда он изменяется, вы должны видеть вывод в system.log (используйте Console.app).Чтобы деактивировать logger.plist, запустите:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
В приведенном выше файле конфигурации используется WatchPaths
вариант.В качестве альтернативы вы также можете использоватьQueueDirectories
вариант.См. запуск справочную страницу для получения дополнительной информации.
Facebook's сторож, доступный через Homebrew, также выглядит красиво.Он также поддерживает фильтрацию:
Эти две строки устанавливают наблюдение за исходным каталогом, а затем настраивают триггер с именем "buildme", который будет запускать инструмент с именем "minify-css" при каждом изменении файла CSS.Инструменту будет передан список измененных имен файлов.
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
Обратите внимание, что путь должен быть абсолютным.
сторожевая собака это кросс-платформенный API-интерфейс Python для просмотра файлов/каталогов, который имеет встроенный инструмент «хитростей», который позволяет запускать действия (включая команды оболочки) при возникновении событий (включая новый добавленный файл, удаленный файл и измененный файл).
Это просто упомянуть вход в качестве альтернативы OSX для запуска произвольных команд при изменении файлов.Я считаю это простым и полезным.
Редактировать: fsw
был объединен в fswatch
.В этом ответе любая ссылка на fsw
теперь должен прочитать fswatch
.
Я написал fswatch
замена в C++ называется fsw
который имеет несколько улучшений:
Это проект системы сборки GNU, который строится на любой поддерживаемой платформе (OS X v.>= 10.6) с
./configure && make && sudo make install
Несколько путей могут быть переданы в качестве разных аргументов:
fsw file-0 ... file-n
Он выдает подробную запись со всей информацией о событии, такой как:
Sat Feb 15 00:53:45 2014 - /path/to/file:inodeMetaMod modified isFile
Его вывод легко проанализировать, так что
fsw
выходные данные могут быть переданы в другой процесс.- Задержку можно настроить с помощью
-l, --latency
. - Числовые флаги событий можно записать вместо текстовых с помощью
-n, --numeric
. - Формат времени можно настроить с помощью
strftime
форматировать строки с помощью-t, --time-format
. - Время может быть местный время машины (по умолчанию) или время UTC с
-u, --utc-time
.
Получение ФСВ:
fsw
является размещено на GitHub и его можно получить, клонировав его репозиторий:
git clone https://github.com/emcrisostomo/fsw
Установка ФСВ:
fsw
можно установить с помощью следующих команд:
./configure && make && sudo make install
Дальнейшая информация:
Я также написал вступление Сообщение блога где вы можете найти пару примеров о том, как fsw
работает.
Вот однострочник, использующий sschober
's инструмент.
$ while true; do kqwait doc/my_file.md; make; done
Apple OSX Действия с папками позволяют автоматизировать задачи на основе действий, выполняемых с папкой.
Моя вилка фсвотч обеспечивает функциональность inotifywait -m
чуть меньше (нет, погодите, больше!У меня гораздо больше проблем с Linux с inotifywait
...) вывод, удобный для анализа.
Это улучшение оригинала fswatch
потому что он отправляет фактический путь к измененному файлу через STDOUT, а не требует от вас предоставления программы, которую он разветвляет.
Он стал прочной основой для серии страшных bash-скриптов, которые я использую для автоматизации.
(это не по теме) inotifywait
в Linux, с другой стороны, требуется много клудов, и я до сих пор не нашел хорошего способа справиться с этим, хотя я думаю, что что-то основано на node.js
может быть билет.
У меня есть GIST для этого, и использовать его довольно просто.
watchfiles <cmd> <paths...>
Для иллюстрации следующая команда выведет эхо Hello World
каждый раз, когда это file1
ИЛИ file2
изменять;и интервал проверки по умолчанию составляет 1 секунду
watchfiles 'echo Hello World' /path/to/file1 /path/to/file2
Если я хочу проверять каждые 5 секунд, я могу использовать -t
флаг
watchfiles -t 'echo Hello World' /path/to/file1 /path/to/file2
-v
позволяетverbose
режим, который показывает отладочную информацию-q
делаетwatchfiles
действуй тихо(#
будет отображаться, чтобы пользователь мог видеть, как программа выполняется)-qq
делаетwatchfiles
выполнять совершенно тихо-h
показывает помощь и использование
https://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
В итоге я сделал это для macOS.Я уверен, что это ужасно во многих отношениях:
#!/bin/sh
# watchAndRun
if [ $# -ne 2 ]; then
echo "Use like this:"
echo " $0 filename-to-watch command-to-run"
exit 1
fi
if which fswatch >/dev/null; then
echo "Watching $1 and will run $2"
while true; do fswatch --one-event $1 >/dev/null && $2; done
else
echo "You might need to run: brew install fswatch"
fi
Вот простая однострочная альтернатива для пользователей, у которых нет watch
команда, которая хочет выполнять команду каждые 3 секунды:
while :; do your-command; sleep 3; done
Это бесконечный цикл, который по сути аналогичен следующему:
watch -n3 your-command