Переместите файл в другой каталог после завершения переноса

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

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

Я подумал о том, чтобы сделать что-то вроде:

  • Скопируйте файл (rsync) во временный каталог.
  • После завершения переместите (простой «mv») в каталог кодирования.
  • Попросите мой сценарий отслеживать каталог кодирования.

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

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

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

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

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


person javanix    schedule 15.04.2012    source источник


Ответы (3)


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

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

person sizzzzlerz    schedule 16.04.2012
comment
rsync работает таким же образом - файл не будет отображаться в списке файлов для кодирования, пока не будет завершена передача. - person javanix; 03.05.2012

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

while lsof | grep /path/to/download >/dev/null; do sleep 5; done
mv /path/to/download /path/to/encode/dir
person Kevin    schedule 15.04.2012
comment
Это должно сработать в крайнем случае, но я бы хотел избежать опроса, если это вообще возможно. - person javanix; 16.04.2012

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

inotifywait -e close_write "$download_file"
mv "$download_file" "$new_location"
person Kevin    schedule 16.04.2012