Есть ли команда, как "watch "или" inotifywait " на Mac?
Я хочу посмотреть папку на моем Mac (Snow Leopard), а затем выполнить скрипт (давая ему имя файла того, что только что было перемещено в папку (в качестве параметра... х.ш "именем")).
У меня есть сценарий, написанный в bash (x.sh), который будет перемещать некоторые файлы и другие вещи на входе $1 Мне просто нужно OSX, чтобы дать мне имя файла, когда новые файлы/папки перемещаются/создаются в dir.
любая такая команда?
12 ответов
fswatch
fswatch это небольшая программа с помощью Mac OS X FSEvents API для мониторинга каталога.
Когда получено событие о любом изменении в этом каталоге, указанное
команда оболочки выполняется /bin/bash
если вы на GNU / Linux,
inotifywatch (часть
inotify-tools
пакет на большинстве дистрибутивов) предоставляет аналогичные
функциональность.
обновление: fswatch
теперь можно использовать во многих платформы, включая BSD, Debian и Windows.
Синтаксис / Простой Пример
новый способ, который может смотреть несколько путей-для версии 1.X и выше:
fswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh
старый способ для версии 0.x:
fswatch ~/path/to/watch ~/script/to/run/when/files/change.sh
установка с Homebrew
по состоянию на 9/12/13 он был добавлен обратно в доморощенного - ура! Итак, обновите список формул (brew update
), а затем все, что вам нужно сделать есть:
brew install fswatch
установка без Homebrew
введите эти команды в 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 можно настроить для автоматического запуска программы при изменении пути к файлу.
например, следующий launchd config plist запустит программу /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>
чтобы активировать config plist, сохраните его в папке LaunchAgents в папке библиотеки как " logger.файл plist".
из оболочки вы можете использовать команда launchctl
для активации регистратора.plist, запустив:
$ launchctl load ~/Library/LaunchAgents/logger.plist
папка рабочего стола теперь контролируется. Каждый раз, когда он изменяется, вы должны видеть вывод в системе.лог (консоль использовать.приложение.) Чтобы выключить регистратор.plist файл, запустите:
$ launchctl unload ~/Library/LaunchAgents/logger.plist
файл конфигурации выше использует . В качестве альтернативы вы также можете использовать . Вижу launchd man-страница для получения дополнительной информации.
Facebook по сторож, доступный через Homebrew, также выглядит красиво. Он также поддерживает фильтрацию:
эти две строки устанавливают часы в исходном каталоге, а затем устанавливают до триггера с именем "buildme", который будет запускать инструмент с именем "minify-css" всякий раз, когда файл CSS изменяется. Инструмент будет передан список изменены имена.
$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css
обратите внимание, что путь должен быть абсолютный.
сторож - это кросс-платформенный API python для просмотра файлов / каталогов, и он имеет встроенный инструмент "трюки", который позволяет запускать действия (включая команды оболочки), когда происходят события (включая новый добавленный файл, удаленный файл и измененный файл).
Это лишь entr в качестве альтернативы на OSX для запуска произвольных команд при изменении файлов. Я нахожу это простым и полезным.
Apple OSX Действия С Папками позволяет автоматизировать задачи на основе действий, выполняемых в папке.
Edit: fsw
был объединен в fswatch
. В этом ответе любая ссылка на fsw
теперь следует читать fswatch
.
я написал fswatch
замена в C++ называется fsw
который имеет несколько улучшений:
-
это системный проект GNU Build, который строится на любой поддерживаемой платформе (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
. - формат времени можно настроить с помощью строки
-t, --time-format
. - время может быть местные время машины (по умолчанию) или время UTC с
-u, --utc-time
.
получение fsw:
fsw
is размещено на GitHub и можно получить клонирование своего репозитория:
git clone https://github.com/emcrisostomo/fsw
установка fsw:
fsw
может быть установлен с помощью следующей команды:
./configure && make && sudo make install
дополнительная информация:
я тоже написал вступительное блоге где можно найти пару примеров о том, как fsw
строительство.
вот однострочное использование sschober
' s инструмент.
$ while true; do kqwait doc/my_file.md; make; done
моя вилка fswatch обеспечивает функциональность inotifywait -m
чуть меньше (нет, больше! У меня намного больше проблем с Linux с inotifywait
...) разбор-дружественный выход.
это улучшение по оригинальным fswatch
потому что он отправляет фактический путь измененного файла через STDOUT, а не требует, чтобы вы предоставили программу, которую он разветвляет.
Это было твердым камнем, как основа серии страшных сценариев bash, которые я использую для автоматизировать.
(это не по теме) inotifywait
на Linux, с другой стороны, требуется много kludges поверх него, и я до сих пор не выяснил хороший способ управлять им, хотя я думаю, что-то на основе node.js
может быть билет.
у меня есть суть для этого, и использование довольно простое
watchfiles <cmd> <paths...>
чтобы проиллюстрировать, следующая команда будет Эхо Hello World
каждый раз file1
или file2
change; и проверка интервала по умолчанию - 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
вот простая однострочная Альтернатива для пользователей, у которых нет watch
команда, которая хочет выполнять команду каждые 3 секунды:
while :; do your-command; sleep 3; done
Это бесконечный цикл, который в основном совпадает со следующим:
watch -n3 your-command