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

StackOverflow https://stackoverflow.com/questions/1515730

  •  19-09-2019
  •  | 
  •  

Вопрос

Я хочу просмотреть папку на моем 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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top