Я хочу посмотреть папку на моем Mac (Snow Leopard), а затем выполнить скрипт (присвоив ему имя файла, который был только что перемещен в папку (как параметр ... x.sh "filename")).
У меня есть сценарий, написанный на bash (x.sh), который будет перемещать некоторые файлы и другие данные на входе $ 1. Мне просто нужен OSX, чтобы дать мне имя файла, когда новые файлы / папки перемещаются / создаются в каталог.
Любая такая команда?
fswatch
Util представлен как ответ ниже делает фактически использовать этот метод.Ответы:
fswatch
fswatch - это небольшая программа, использующая Mac OS X FSEvents API для мониторинга каталога. Когда получено событие о любом изменении в этом каталоге, указанная команда оболочки выполняется
/bin/bash
Если вы работаете в GNU / Linux, inotifywatch (часть
inotify-tools
пакета в большинстве дистрибутивов) обеспечивает аналогичную функциональность.Обновление:
fswatch
теперь может использоваться на многих платформах, включая BSD, Debian и Windows.Синтаксис / Простой пример
Новый способ просмотра нескольких путей - для версий 1.x и выше :
Старый способ для версий 0.x :
Установка с помощью Homebrew
По состоянию на 12.09.13 он был добавлен обратно в доморощенный - ууу! Итак, обновите список формул (
brew update
), а затем все, что вам нужно сделать, это:Установка без доморощенного
Введите эти команды в
Terminal.app
Если у вас нет
c
компилятора в вашей системе, вам может понадобиться установить инструменты командной строки Xcode или Xcode - и то, и другое бесплатно. Тем не менее, если это так, вам, вероятно, следует просто проверить доморощенный .Дополнительные параметры для
fswatch
версии 1.xисточник
make
выдает ошибку о том, что не нашел make-файл К счастью, fswatch теперь на MacPorts, так чтоsudo port install fswatch
работает, для тех из нас, кто использует MacPorts вместо Homebrew.fswatch ./ | xargs -I{} cp {} ~/Dropbox/backup/latest/
fswatch .
будете следить за текущим каталогом.fswatch -0 -v -o /path/to/watched/files | xargs -0 -n 1 -I {} [your command]
с-0
для NULL. Этот работает для меня меньше сборникВы можете использовать launchd для этой цели. Launchd может быть настроен на автоматический запуск программы при изменении пути к файлу.
Например, следующий лист запуска configd запустит программу
/usr/bin/logger
при изменении папки рабочего стола моей учетной записи:Чтобы активировать список настроек, сохраните его в папке LaunchAgents в папке «Библиотека» как «logger.plist».
Из оболочки вы можете использовать команду
launchctl
для активации logger.plist, выполнив:Папка рабочего стола теперь отслеживается. Каждый раз, когда он изменяется, вы должны видеть вывод в system.log (используйте Console.app). Чтобы отключить logger.plist, запустите:
Файл конфигурации выше использует эту
WatchPaths
опцию. В качестве альтернативы вы также можете использовать этуQueueDirectories
опцию. Смотрите mand- страницу launchd для получения дополнительной информации.источник
/usr/bin/logger
со своим сценарием Bash и удалил"<string>path modified</strong>"
запись, я не смог найти способ для моего сценария bash узнать, какой файл на моем рабочем столе был изменен - только что произошло событие. Я попытался посмотреть$0
,$1
и получил только имя сценария, отметив, что передано ему.Сторож Facebook , доступный через Homebrew, также выглядит красиво. Поддерживает также фильтрацию:
Обратите внимание, что путь должен быть абсолютным.
источник
Возможно, вы захотите взглянуть (и, возможно, расширить) мой маленький инструмент
kqwait
. В настоящее время он просто сидит и ждет события записи для одного файла, но архитектура kqueue допускает иерархическое наложение событий ...источник
fswatch
(что тоже хорошо, так как это такая легкая оболочка, она также может быть изменена, чтобы делать все правильно, я уверен), где она будет срабатывать при запуске таких вещейgit status
(которые на самом деле запускаются каждый раз, когда zsh на моем компьютере выводится запрос ...), который, на самом деле, как бы запутывает этот сложный скрипт, создавая бесконечный цикл обратной связи. kqwait, однако, предоставляет информацию об измененном файле и не отключаетсяgit status
. Мне действительно нужно, чтобы выстрел, хотя.$ brew install kqwait && while true; do kqwait doc/my_file.md; make; done
watchdog - это кроссплатформенный Python API для просмотра файлов / каталогов, и он имеет встроенный инструмент «хитрости», который позволяет запускать действия (включая команды оболочки) при возникновении событий (включая новый добавленный файл, удаленный файл и измененный файл).
источник
Это просто упомянуть entr как альтернативу OSX для запуска произвольных команд при изменении файлов. Я нахожу это простым и полезным.
источник
Вот один вкладыш с использованием
sschober
«s инструмента .источник
$ brew install kqwait
Изменить:
fsw
был объединен вfswatch
. В этом ответе любая ссылка наfsw
теперь должна читатьсяfswatch
.Я написал
fswatch
замену в C ++,fsw
которая имеет несколько улучшений:Это проект системы сборки GNU, который построен на любой поддерживаемой платформе (OS X v.> = 10.6) с
Несколько путей могут быть переданы как разные аргументы:
Он выводит подробную запись со всей информацией о событии, такой как:
Его выходные данные легко анализируются, поэтому
fsw
выходные данные могут быть переданы другому процессу.-l, --latency
.-n, --numeric
.strftime
строк формата с-t, --time-format
.-u, --utc-time
.Получение fsw:
fsw
будет размещен на GitHub и может быть получена клонированием его хранилище:Установка fsw:
fsw
можно установить с помощью следующих команд:Дальнейшая информация:
Я также написал вступительное сообщение в блоге, где вы можете найти пару примеров о том, как
fsw
работает.источник
Действия папки Apple OSX позволяют автоматизировать задачи на основе действий, выполняемых над папкой.
источник
Моя ветвь fswatch предоставляет функциональность
inotifywait -m
с немного меньшим (не подождите, больше! У меня намного больше проблем с Linux сinotifywait
...) дружественным для синтаксического анализа выводом.Это улучшение по сравнению с оригиналом,
fswatch
поскольку он отправляет фактический путь измененного файла через STDOUT, а не требует от вас предоставления программы, которую он разветвляет.Это было прочное основание серии страшных скриптов bash, которые я использую для автоматизации вещей.
(это не по теме)
inotifywait
в Linux, с другой стороны, требуется много кладжей поверх него, и я до сих пор не нашел хорошего способа управления им, хотя я думаю, что что-то, основанное на этом,node.js
может быть билетом.источник
brew install https://raw.github.com/mlevin2/homebrew/116b43eaef08d89054c2f43579113b37b4a2abd3/Library/Formula/fswatch.rb
У меня есть GIST для этого, и использование довольно просто
Чтобы проиллюстрировать это, следующая команда будет отображать эхо
Hello World
каждый раз, когдаfile1
ИЛИfile2
изменяется; и интервал проверки по умолчанию составляет 1 секундуЕсли я хочу проверять каждые 5 секунд, я могу использовать
-t
флаг-v
включаетverbose
режим, который показывает отладочную информацию-q
выполняетwatchfiles
выполнение тихо (#
будет показано, чтобы пользователь мог видеть, как выполняется программа)-qq
заставляетwatchfiles
казаться совершенно спокойно-h
показывает помощь и использованиеhttps://gist.github.com/thiagoh/5d8f53bfb64985b94e5bc8b3844dba55
источник
Я закончил тем, что делал это для macOS. Я уверен, что это ужасно во многих отношениях:
источник
Если вы хотите использовать 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\"
источник
Вот простая однострочная альтернатива для пользователей, у которых нет
watch
команды, которые хотят выполнять команду каждые 3 секунды:while :; do your-command; sleep 3; done
Это бесконечный цикл, который в основном аналогичен следующему:
watch -n3 your-command
источник
your-command
выполняется дисковый ввод / вывод, то это гарантированное чтение / запись диска каждые 3 секунды - или 10 800 раз в час. Используя события файловой системы, вы гарантируете, что ввод-вывод (и другие дорогостоящие операции) будут происходить только при изменении файла (что обычно происходит всего пару раз в час.)watch
то временное, чтобы посмотреть, что что-то делает. Я не использую свою упомянутую технику для производственных приложений или чего-то подобного. Например, я хотел бы видеть прогрессdd
, и моя техника делает это возможным (заменивyour-command
при необходимости, чтобы отправить соответствующий сигналdd
).