Используйте inotifywait для перемещения файла, когда он загружается в папку dropbox

12

Я пытаюсь найти способ немедленно переместить файл в другую папку, как только он появится в моем выпадающем списке на CentOS.

Я искал Интернет для некоторых подсказок, но я не могу получить больше, чем тот факт, что мне нужно использовать inotifyдля вызова скрипта, который будет обрабатывать файл, как он выглядит.

Мои знания BASH очень ограничены, и я сомневаюсь, что смогу написать это на PHP.

Другими словами, как я могу переместить файл в другую папку, как только он появится с помощью inotify?

Ortix92
источник
Является ли имя файла предсказуемым? Или это место? Было бы полезно больше подробностей ...
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

С более подробной информацией о типах файлов, которые вы хотите переместить, вы можете добавить некоторые проверки, журналы и т. Д ...

jasonwryan
источник
Я не смог проверить ни один из предложенных ответов. Вещи подошли. Буду делать это как можно скорее! Однако, у меня есть вопрос. Если бы я поместил это в файл 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, так как имя файла никогда не будет содержать двойной косой черты, пока путь для просмотра не будет; тогда раздражение на стороне разбора.
Жиль "ТАК - перестань быть злым"