2012-04-15 2 views
6

У меня есть сценарий кодирования видео, который я хотел бы запустить, как только файл будет перемещен в определенный каталог.Переместить файл в другой каталог после его переноса

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

Я считал делать что-то вроде:

  • Copy (Rsync) файл во временную директорию.
  • Закончив, переместите (простое «mv») в каталог кодирования.
  • Попросите мой скрипт контролировать каталог кодировки.

Однако, как я могу сделать шаг № 2 правильно работать и работать только после завершения # 1?

Я использую Ubuntu Server 11.10, и я бы хотел использовать bash, но я мог бы убедить вас использовать Python, если это упростит проблемы.

Я не «загружаю» файлы в этот каталог, сам по себе; скорее я буду использовать rsync подавляющее большинство времени.

Кроме того, этот сервер Ubuntu работает на виртуальной машине.

У меня есть мое основное хранилище файлов, смонтированное через NFS с сервера FreeBSD.

ответ

1

Один метод, который я использую, работает с FTP. Вы передаете команду FTP-серверу для передачи файла во вспомогательный каталог. Как только команда завершается, вы отправляете вторую команду на сервер, на этот раз сообщая ей переименовать файл из каталога aux в конечный каталог назначения. Если вы используете inotify или опрос каталога, имя файла не появится пока переименование не завершится, вы гарантируете, что файл будет завершен.

Я не знаком с rsync, поэтому не знаю, имеет ли он аналогичную возможность переименования.

+0

rsync работает так же - файл не будет отображаться в списке файлов, которые будут закодированы до тех пор, пока не будет выполнена передача. – javanix

2

Самый простой способ - загрузить с помощью программы, такой как wget или curl, которая не выйдет, пока файл не будет загружен. В противном случае, я не уверен, что это самое лучшее решение, но вы можете использовать скрипт, который петли, проверяя, открыт ли файл, используя lsof и grep:

while lsof | grep /path/to/download >/dev/null; do sleep 5; done 
mv /path/to/download /path/to/encode/dir 
+0

Это должно работать в крайнем случае, но я бы хотел избежать опроса, если это вообще возможно. – javanix

0

inotifywait выглядит многообещающим. Вы должны быть несколько осторожны, потому что, если загрузка закончится до того, как будет настроена уведомление, она будет ждать вечно.

inotifywait -e close_write "$download_file" 
mv "$download_file" "$new_location"