Використовуйте inotifywait для переміщення файлу, коли він завантажується в папку "Drobox"


12

Я намагаюся знайти спосіб негайно перемістити файл в іншу папку, як тільки він з’явиться в моєму списку в CentOS.

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

Мої знання BASH дуже обмежені, і я сумніваюся, що можу це написати в PHP.

Іншими словами, як я можу перемістити файл в іншу папку, як тільки він з’явиться за допомогою inotify?


Чи ім'я файлу послідовно передбачуване? Або це розташування? Більш докладно було б корисно ...
jasonwryan

@jasonwryan Це папка "dropbox", тому розташування є послідовним. І це стосується будь-якого файлу, який випав у цій папці.
Ortix92

Відповіді:


13

Це простий підхід:

#!/usr/bin/env bash

dir=/home/ortix/Dropbox/new/
target=/home/ortix/movedfiles/

inotifywait -m "$dir" --format '%w%f' -e create |
    while read file; do
        mv "$file" "$target"
    done

Докладніше про типи файлів, які ви хочете перемістити, ви можете додати перевірку, журнал тощо ...


Я не зміг перевірити жодну із запропонованих відповідей. Речі придумали. Зробимо це якомога швидше! У мене все ж є питання. Якщо я мав би помістити це у файл bash і запустити його, я припускаю, що він буде працювати у фоновому режимі, правильно? У мене завжди є відчуття, що сценарій - це одноразова робота, але тут inotifywait продовжує працювати, правильно?
Ortix92

2
прослуховування createподії неправильно, оскільки ви будете робити mvфайл, який може бути не повністю скопійований на диск. Дивіться відповідь @Gilles, використовуючи close_writeнатомість подію.
fduff

3
@fduff Бачити відповідь Жиля - це завжди правильно ...
jasonwryan

17

Команда inotifywaitдрукує повідомлення щоразу при зміні вмісту зазначеної директорії. Вам потрібно буде вибрати правильну подію: не тоді, коли файл створений, а тоді, коли Dropbox закінчує його завантаження. Я не знаю точно, як працює Dropbox. Якщо він записує у файл на останньому місці, слухайте close_writeподії. Якщо він записує файл у тимчасове місце, а потім переміщує його на місце, слухайте moved_toподії. Проходять варіанти , -m -qщоб inotifywaitтаким чином , що він тримає прослуховування подій (за замовчуванням, він чекає тільки для наступної події) і друкує тільки відповідні повідомлення.

cd ~/Dropbox/myfolder
inotifywait -m -q -e close_write --format %f . | while IFS= read -r file; do
  cp -p "$file" /path/to/other/directory
done

1
Це не вдається для файлів, які містять нові рядки у своїх назвах. Мені не вдалося знайти спосіб inotifywaitвивести нульові імена файлів. Найкраще, що я міг зробити, - це використовувати символ, який є менш імовірним, ніж новий рядок, наприклад %f$'\001', і використовувати -d $'\001'з while IFS= read -rабо xargs.
Призупинено до подальшого повідомлення.

1
@DennisWilliamson Так, inotifywaitце дратує такий спосіб. Ви можете використовувати щось на зразок //%f, оскільки ім'я файлу ніколи не буде містити подвійну косу рису, доки шлях для перегляду не буде; то роздратування на стороні розбору.
Жиль "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.