Есть ли команда, например, "смотреть" или "inotifywait" на Mac?

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

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

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

Ответ 1

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

Ответ 2

Вы можете использовать launchd для этой цели. 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 в папке Library как "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.

Ответ 3

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

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

$ watchman watch ~/src

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

Изменить: fsw было объединено в fswatch. В этом ответе любая ссылка на fsw должна теперь читать fswatch.

Я написал замену fswatch в С++ под названием 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.
  • Формат времени можно настроить с помощью 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.

Ответ 8

Здесь однострочный, используя sschober инструмент.

$ while true; do kqwait doc/my_file.md; make; done

Ответ 9

Apple OSX Действия с папкой позволяют автоматизировать задачи на основе действий, выполняемых в папке.

Ответ 10

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

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

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

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

Ответ 11

У меня есть GIST для этого, и использование довольно просто

watchfiles <cmd> <paths...>

Чтобы проиллюстрировать, следующая команда будет эхом Hello World каждый раз, когда file1 OR 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

Ответ 12

Я закончил тем, что делал это для 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

Ответ 13

Если вы хотите использовать NodeJS, вы можете использовать пакет под названием chokidar (или chokidar-cli) для просмотра, а затем использовать rsync (входит в Mac):

Команда Rsync:

$ rsync -avz --exclude 'some-file' --exclude 'some-dir' './' '/my/destination'

Chokidar cli (устанавливается глобально через npm):

chokidar \"**/*\" -c \"your-rsync-command-above\"

Ответ 14

Ниже приведен простой простой вариант для пользователей, у которых нет команды watch, которые хотят выполнить команду каждые 3 секунды:

while :; do your-command; sleep 3; done

Это бесконечный цикл, который в основном такой же, как при выполнении следующего:

watch -n3 your-command