Як запустити команду, коли вміст каталогу оновлюється?


27

Є каталог A, вміст якого часто змінюється іншими людьми.

Я зробив особистий каталог, Bде зберігаю всі файли, які коли-небудь були A.

В даний час я просто іноді працювати , rsyncщоб отримати файли для резервного копіювання від Aдо B. Однак я боюся можливості, що деякі файли будуть додані A, а потім видалені з них, Aперш ніж я отримаю можливість скопіювати їх B.

Який найкращий спосіб запобігти цьому? В ідеалі, я хотів би, щоб мій поточний сценарій резервного копіювання запускався кожного разу, коли зміст вмісту Aбуде змінено.

Відповіді:


29

Якщо у вас встановлені інструменти 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:

змінити
Записуваний файл або файл у каталог, що спостерігається, було записано в.

5
incrondможе також представляти інтерес.
Шон Дж. Гофф

1
Класно. Я б просто поставив вищезазначений скрипт у мою програму bashrc, щоб він запускався під час входу? Чи є інший спосіб, коли я можу його постійно працювати?
oadams

Для входу, так /etc/profileдля системи або .bash_profileпросто для вашого користувача. Щоб запустити його після завантаження, це залежить від вашого смаку Unix / Linux; /etc/rc.local, /etc/rc.d/або/etc/init.d/
jasonwryan

1
Для більших каталогів ви можете подумати про використання --monitorперемикача (і замість цього передати висновок у свою петлю), інакше виникає багато накладних витрат, коли inotifywaitзапускається знову і знову
Tobias Kienzler

Наскільки надійно працює це рішення для запуску скрипту для кожного файлу, який був доданий у дерево каталогів через FTP-сервер (скажімо, що новий файл додається в середньому кожні 3 хвилини, і це може тривати протягом років)? Якщо не дуже, чи існує альтернативне рішення?
Микола Новак

5

Строго кажучи, якщо хтось скидає файл і дуже швидко його видаляє, ви можете його пропустити. Використання inotify (під Linux або подібною функцією в інших уніксах) робить вікно ризику невеликим.

Якщо ви можете змонтувати обрану файлову систему в цій директорії (я розумію, що це може бути не варіант), ви можете помістити її, яка записує всі версії файлів, наприклад copyfs .


4

Спробуйте 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 для отримання більш детальної інформації.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.