共有フォルダの新しいファイルを監視するスクリプト(Windowsホスト、Linuxゲスト)

共有フォルダの新しいファイルを監視するスクリプト(Windowsホスト、Linuxゲスト)

新しいファイルまたは変更されたファイルを表示するには、共有フォルダを監視する必要があります。この場合、ホストはWindowsで、ゲストはUbuntu Linuxです。理想的には、このソリューションはファイルが共有ディレクトリにあるホストまたはコンピュータとは独立して動作するはずです。新しいファイルは他のプロセスへの入力として使用されます。

ファイルがホストによって作成され、共有フォルダに配置されている場合、inotifywaitツールセットは新しいファイルを検出しません。

私のオプションは何ですか?

答え1

ファイルが Windows 側で変更された場合、Linux カーネルはこれを知らないため、変更のためにファイルをポーリングする必要があります。 Guardなど、この問題を解決するのに役立ついくつかの既存のアプリケーションがあります。http://guardgem.org/

特定の要件に応じてwatchファイルを一覧表示できます(n秒を適切な値に調整します)。

watch --differences -n 10 ls -l </path/to/shared/dir>

答え2

以前の投票ツールのいずれかを使用することもできます。通知するそしてinotify:賭けるまたは家族、そして次のことファイルが変更されました。これはinotifywaitCLIに似たツールです。 gaminとfamプロジェクトは互いに関連しており、どちらもかなり古い(gaminは少し少ないが)。

シンプルでポータブルな作業のために私が使用したこのようなスケジュールされたタスクを通して:

if mkdir /var/lock/mylock; then
  ( cd /mnt/mypath; find . -type f -mmin +2 ) | myprocess
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

これは、rawロックとGNUfind条件を使用してファイルのみを検索します。年をとる2分以内で、ファイルが完全に作成されたことを確認できました。私の場合、ファイルmyprocessrsync --remove-source-files --files-from=-処理された後に削除されました。

このアプローチでは、//を使用して問題のあるファイル名を処理することもできますfind -print0xargs -0rsync -0

すべてのファイル(古いファイルと新しいファイル)を同じディレクトリ階層に保持する必要がある場合は、ディレクトリリストのスナップショットを作成して比較することも役立ちます。

if mkdir /var/lock/mylock; then
  ( 
    export LC_COLLATE=C  # for sort
    cd /mnt/mypath
    find . -type f -a \! -name ".dirlist.*" -printf '%p\0' | 
      while read -d '' file; do
        printf "%q\n" "${file}"  
      done > .dirlist.new
    [[ -f  .dirlist.old ]] && {
      comm -13 <(sort .dirlist.old) <(sort .dirlist.new) |
        while read -r file; do
          myprocess "${file}"
        done
    }
    mv .dirlist.new .dirlist.new
  )
  rmdir /var/lock/mylock
else
  logger -p local0.notice "mylock found, skipping run"
fi

このbashスクリプトは次のとおりです。

  1. find -printf\0(nul) で区切られたファイルのリストを印刷する場合
  2. read -d ''リストを処理し、printf %q必要に応じてファイル名をエスケープするために使用されます。
  3. 新しいファイルと古い.dirlistファイルの比較
  4. それぞれの新しいファイル呼び出しmyprocess(安全な参照)

(また処理中修正済みfind ... -printf '%p\0%s %Ts\0'ファイルには2行形式を使用してwhileループに関連する変更を適用するなど、少しの労力が必要です。 )

答え3

node.jsとそのエコシステムに精通している場合は、次のものを使用できます。この図書館 共有フォルダのポーリングを実装します。

関連情報