Dropboxフォルダーに読み込まれたときにinotifywaitを使用してファイルを移動する


12

CentOSのドロップボックスに表示されたらすぐにファイルを別のフォルダーに移動する方法を探しています。

私はいくつかの手がかりを求めてインターネットを調査しましたがinotify、表示されたとおりにファイルを処理するスクリプトを呼び出すために使用する必要があるという事実以上のことはできません。

私のBASHの知識は非常に限られているので、これをPHPで記述できるかどうかは疑問です。

つまり、使用して表示されたらすぐにファイルを別のフォルダに移動するにはどうすればよいinotifyですか?


ファイルの名前は一貫して予測可能ですか?それとも場所ですか?詳細が参考になります...
jasonwryan 2013

@jasonwryanこれはドロップボックスフォルダーなので、場所が一貫しています。そして、それはそのフォルダにドロップされたすべてのファイルに適用されます。
Ortix92 2013

回答:


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ファイルに入れて実行すると、バックグラウンドで実行されると思いますか?私はいつもスクリプトは1回実行されるものだと感じていますが、ここではinotifywaitが実行を続けますよね?
Ortix92 2013

2
createイベントをリッスンするのは正しくmvありません。ディスクに完全にコピーされていない可能性のあるファイルでを行うためです。close_write代わりにイベントを使用して、@ Gillesの回答を参照してください。
fduff、2014年

3
@fduff Gillesの答えを見ることは常に正しいことです...
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
これは、名前に改行が含まれているファイルでは失敗します。inotifywaitnullで終わるファイル名を出力する方法を見つけることができませんでした。私ができる最善のことは、たとえば%f$'\001'、改行よりも可能性の低い文字を使用-d $'\001'して、while IFS= read -rまたはで使用することxargsでした。
追って通知があるまで一時停止。

1
@DennisWilliamsonはい、inotifywaitそのように迷惑です。のような//%fパスを使用しない限り、ファイル名に二重スラッシュが含まれることはないため、のようなものを使用できます。次に、煩わしさが解析側にあります。
Gilles「SO-邪悪なことをやめよう」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.