Есть ли такая команда, как «смотреть» или «inotifywait» на Mac? - PullRequest
253 голосов
/ 04 октября 2009

Я хочу посмотреть папку на моем Mac (Snow Leopard), а затем выполнить скрипт (присвоив ему имя файла, который был только что перемещен в папку (как параметр ... x.sh "filename")).

У меня есть скрипт, написанный на bash (x.sh), который будет перемещать некоторые файлы и другие данные при вводе $ 1. Мне просто нужен OSX, чтобы дать мне имя файла, когда новые файлы / папки перемещаются / создаются в каталог .

Любая такая команда?

Ответы [ 13 ]

398 голосов
/ 10 декабря 2012

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 -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

По состоянию на 12.09.13 он был добавлен обратно в homebrew - ууу! Поэтому обновите список формул (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 - оба бесплатны. Однако, если это так, вам, вероятно, следует просто проверить доморощенный .

Дополнительные опции для 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.
88 голосов
/ 04 октября 2009

Вы можете использовать launchd для этой цели. Launchd может быть настроен на автоматический запуск программы при изменении пути к файлу.

Например, следующий лист запуска configd запустит программу /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 вариант. Для получения дополнительной информации см. Справочную страницу launchd .

24 голосов
/ 07 апреля 2014

сторож Facebook , доступный через Homebrew, также выглядит красиво Поддерживает также фильтрацию:

Эти две строки устанавливают наблюдение за исходным каталогом и затем устанавливают до триггера с именем "buildme", который будет запускать инструмент с именем "minify-css" всякий раз, когда файл CSS изменяется. Инструмент будет передан список измененные имена файлов.

$ watchman watch ~/src

$ watchman -- trigger ~/src buildme '*.css' -- minify-css

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

21 голосов
/ 25 января 2012

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

14 голосов
/ 11 мая 2012

watchdog - это кроссплатформенный Python API для просмотра файлов / каталогов, а также встроенный инструмент «хитрости», который позволяет запускать действия (включая команды оболочки) при возникновении событий (включая новый добавленный файл , удалил файл и изменил файл).

6 голосов
/ 18 октября 2016

Это просто упоминание entr как альтернативы в OSX для запуска произвольных команд при изменении файлов. Я нахожу это простым и полезным.

3 голосов
/ 24 апреля 2016

Вот один вкладыш, использующий sschober инструмент .

$ while true; do kqwait doc/my_file.md; make; done
3 голосов
/ 15 февраля 2014

Редактировать: 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:

fsw является размещенным на GitHub и может быть получен путем клонирования его хранилища:

    git clone https://github.com/emcrisostomo/fsw

Установка fsw:

fsw можно установить с помощью следующих команд:

    ./configure && make && sudo make install

Дополнительная информация:

Я также написал вступительное сообщение в блоге , где вы можете найти пару примеров о том, как fsw работает.

2 голосов
/ 05 апреля 2017

У меня есть 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

2 голосов
/ 22 мая 2013

Мой форк fswatch обеспечивает функциональность inotifywait -m с немного меньшими затратами (нет, подождите, больше! У меня гораздо больше проблем с Linux с inotifywait ...) выводом для анализа.

Это улучшение по сравнению с исходным fswatch, поскольку оно отправляет фактический путь измененного файла через STDOUT, а не требует от вас предоставления программы, которую он разветвляет.

Это было прочное основание серии страшных сценариев bash, которые я использую для автоматизации вещей.

(это не по теме) inotifywait в Linux, с другой стороны, требует много кладжей поверх него, и я до сих пор не нашел хорошего способа управления им, хотя я думаю, что что-то основано на node.js может быть билет.

...