2012-04-15 34 views
6

Tôi có tập lệnh mã hóa video mà tôi muốn chạy ngay khi tệp được chuyển vào một thư mục cụ thể.Di chuyển tệp vào thư mục khác sau khi chuyển xong

Nếu tôi sử dụng một cái gì đó như inotify, làm thế nào để đảm bảo rằng các tập tin không được mã hóa cho đến khi nó được thực hiện di chuyển?

tôi đã xem xét làm một cái gì đó như:

  • Sao chép (rsync) tập tin vào thư mục tạm thời.
  • Sau khi hoàn tất, di chuyển (đơn giản 'mv') vào thư mục mã hóa.
  • Yêu cầu tập lệnh của tôi giám sát thư mục mã hóa.

Tuy nhiên, làm cách nào để làm cho bướC# 2 hoạt động bình thường và chỉ chạy khi # 1 hoàn tất?

Tôi đang sử dụng Ubuntu Server 11.10 và tôi muốn sử dụng bash, nhưng tôi có thể được thuyết phục để sử dụng Python nếu điều đó đơn giản hóa vấn đề.

Tôi không "tải xuống" tệp vào thư mục này, mỗi lần; thay vào đó tôi sẽ sử dụng rsync phần lớn thời gian.

Ngoài ra, Máy chủ Ubuntu này đang chạy trên máy ảo.

Tôi có bộ nhớ tệp chính được gắn qua NFS từ máy chủ FreeBSD.

Trả lời

1

Một kỹ thuật tôi sử dụng làm việc với FTP. Bạn đưa ra lệnh cho máy chủ FTP để chuyển tệp sang thư mục phụ. Khi lệnh hoàn tất, bạn gửi lệnh thứ hai tới máy chủ, lần này yêu cầu đổi tên tệp từ thư mục aux thành thư mục đích cuối cùng.Nếu bạn đang sử dụng inotify hoặc bỏ phiếu, thư mục sẽ không xuất hiện cho đến khi việc đổi tên hoàn thành, do đó, bạn được đảm bảo rằng tệp đã hoàn tất.

Tôi không quen với rsync vì vậy tôi không biết liệu nó có khả năng đổi tên tương tự hay không.

+0

rsync hoạt động theo cách tương tự - tệp sẽ không hiển thị trong danh sách các tệp được mã hóa cho đến khi nó được chuyển xong. – javanix

2

Cách dễ nhất là tải xuống bằng chương trình như wget hoặc curl không thoát cho đến khi tệp được tải xuống xong. Nếu không được, tôi không chắc chắn nếu đó là giải pháp tốt nhất tuyệt đối, nhưng bạn có thể sử dụng một kịch bản mà vòng, kiểm tra xem các tập tin đang mở sử dụng lsofgrep:

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

Điều này sẽ hoạt động trong một nhúm nhưng tôi muốn tránh bỏ phiếu nếu có thể. – javanix

0

inotifywait trông đầy hứa hẹn. Bạn phải cẩn thận vì nếu tải xuống hoàn tất trước khi thông báo được thiết lập, nó sẽ chờ mãi mãi.

inotifywait -e close_write "$download_file" 
mv "$download_file" "$new_location" 
Các vấn đề liên quan