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