Есть ли такая команда, как" watch "или" inotifywait " на Mac?


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

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

есть такая команда?

12 230

12 ответов:

fswatch

fswatch это небольшая программа, использующая API Mac OS X FSEvents для мониторинга каталога. Когда получено событие о любом изменении в этом каталоге, указанный команда оболочки выполняется с помощью /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

установка с доморощенным

по состоянию на 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 можно настроить для автоматического запуска программы при изменении пути к файлу.

например, следующий 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>

чтобы активировать список конфигурации, сохраните его в папке LaunchAgents в папке библиотеки как " logger.файл plist".

из оболочки вы можете использовать команда launchctl для активации регистратора.plist, запустив:

$ launchctl load ~/Library/LaunchAgents/logger.plist

папка рабочего стола теперь контролируется. Каждый раз, когда он изменяется, вы должны видеть выход в системе.войти (использовать консоль.приложение.) Для деактивации регистратора.плист, беги:

$ launchctl unload ~/Library/LaunchAgents/logger.plist

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

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

эти две строки устанавливают часы в исходном каталоге, а затем устанавливают триггер под названием "buildme", что позволит запустить инструмент под названием "Код-УСБ" всякий раз, когда файл 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 System, который строится на любой поддерживаемой платформе (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.
  • время может быть local время машины (по умолчанию) или время UTC с -u, --utc-time.

получение fsw:

fsw и размещено на 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 изменить; и проверка интервала по умолчанию составляет 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