Есть ли команда, как "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

обратите внимание, что путь должен быть абсолютный.


вы можете взглянуть на (и, возможно, расширить) мой маленький инструмент kqwait. В настоящее время он просто сидит и ждет события записи в одном файле, но kqueue архитектура позволяет иерархическую укладку событий...


сторож - это кросс-платформенный 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