Как выполнить команду, когда содержание каталога обновляется?

Другой полезный прием ZSH:

Рассматривайте вывод команды как файл:

emacs =(hg cat -r 100 somefile)

Это открывает старую версию Подвижно прослеженного файла в emacs для выделенного синтаксисом просмотра. Без этого я должен был бы бездельничать с hg revert, hg archive, или явно отправьте hg cat вывод во временный файл.

Конечно, это работает с любой программой, которая открывает файлы и любую программу, которая печатает к стандартному выводу.

28
16.08.2018, 14:40
4 ответа

Если Вам установили inotify-инструменты, можно использовать inotifywait для инициирования действия, если файл или каталог записан в:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

Где -qq переключатель абсолютно тих, -r является рекурсивным (в случае необходимости) и -e событие должно контролировать в этом случае modify. От man inotifywait:

изменить
Наблюдаемый файл или файл в рамках наблюдаемого каталога были записаны в.
29
27.01.2020, 19:39
  • 1
    incrond может также представлять интерес. –  Shawn J. Goff 06.11.2011, 15:50
  • 2
    Здорово. Я просто поместил бы вышеупомянутый сценарий в свой bashrc так, чтобы это выполнение, когда я вхожу в систему? Есть ли иначе, у меня может быть он работающий все время? –  oadams 07.11.2011, 13:53
  • 3
    Для входа в систему, да /etc/profile для в масштабе всей системы или .bash_profile для просто Вашего пользователя. Для выполнения его после начальной загрузки он зависит от аромата Unix/Linux; /etc/rc.local,/etc/rc.d/ или /etc/init.d/ –  jasonwryan 07.11.2011, 19:05
  • 4
    Для больших каталогов Вы могли бы хотеть рассмотреть использование --monitor переключатель (и канал вывод к Вашему циклу вместо этого), иначе существует много издержек когда inotifywait запускается много раз –  Tobias Kienzler 10.01.2013, 19:10
  • 5
    Как надежно это решение работало бы для запущения скрипта для каждого файла, который был добавлен в дереве каталогов через FTP-сервер (скажем, что новый файл добавляется каждые 3 минуты в среднем, и это могло бы продолжиться в течение многих лет)? Если не очень, там альтернативное решение? страница –  Nikola Novak 10.09.2015, 11:50

Программа, которую Вы ищете, inotify.

3
27.01.2020, 19:39

Строго говоря, если кто-то отбрасывает файл и очень быстро удаляет его, Вы могли бы пропустить его. Использование inotify (в соответствии с Linux или подобной функцией под другими нельдами) делает окно риска маленьким.

Если можно смонтировать файловую систему по Вашему выбору на том каталоге (я понимаю, что это не может быть опцией), можно поместить тот, который записывает все версии файла, например, copyfs.

5
27.01.2020, 19:39

Попробуйте инструмент командной строки entr , который может запускать произвольные команды при изменении файлов. Начиная с версии 2.9, опция наблюдения за каталогом ( -d ) была добавлена ​​для реакции на события, когда новый файл добавляется в каталог.

Пример запуска утилиты, если в проект добавляется новый файл:

$ while true; do
> echo src/* | entr -d your_command
> done

В режиме наблюдения за каталогом родительский каталог каждого файла неявно добавляется в список наблюдения.

Единственное значение этого состоит в том, что если появляется новый файл, он должен выйти, чтобы позволить внешнему циклу оболочки повторно просканировать файловую систему.

Вот версия без опции наблюдения за каталогом:

$ while true; do
> echo src/* src | entr your_command
> done

Вот более простой пример, зависящий от ваших потребностей:

$ ls -d * | entr sh -c 'rsync -vuar A B'

Подробнее см. На веб-сайте entrproject.org .

5
27.01.2020, 19:39

Теги

Похожие вопросы