カルsftpsfマウントポイントが期待どおりにファイルを移動しないinotifywait

カルsftpsfマウントポイントが期待どおりにファイルを移動しないinotifywait

Ubuntu 20.04を使用しています。このスクリプトを実行しようとしていますinotifywait。アイデアは、ディレクトリが変更されるたびにファイルを移動することですdirtargetスクリプトは、コマンドラインから自動または手動で起動できるシェルファイルです。

#!/usr/bin/env bash
dir=/mnt/test1/test/ #ftp point of mount
target=/var/www/html/local/ #normal directory on filesystem

inotifywait -m "$dir" --format "%w%f" -e create -e moved_to |
    while read path action file; do
       mv "$file" "$target"
    done

そして、移動するファイルは*.txtフォーマットでなければなりません。 inotifyが見ていますが、ftpクライアントを使ってファイルを置き、dirinotifyがファイルを移動するのを待つと、targetファイルに何も起こりません。

私はこれを参考にしています:https://unix.stackexchange.com/a/86292/425161

答え1

残念ながら、このinotifyAPIはリモートファイルシステムを監視するためには使用できません。

~からman 7 inotify:

Inotifyは、ファイルシステムAPIを介してユーザースペースプログラムによってトリガーされたイベントのみを報告します。したがって、ネットワークファイルシステムで発生するリモートイベントをキャプチャしません。 (アプリケーションはこれらのイベントをキャプチャするためにファイルシステムポーリングに置き換える必要があります。)

関連質問:

つまり、あなたの質問のスクリプトは期待どおりに機能しません。

"%w%f"asの出力形式を使用するアイデアは、inotifywaitリスニングされたファイルシステムイベントをトリガーしたファイルへのフルパスをループ内のコマンドに提供することです。監視対象ファイルのパス%w$dirディレクトリ)と%fイベントを発生させたファイルの(デフォルト)名に展開されます。

したがって、inotifywaitキャプチャする各イベントに対してフルパスのみがエクスポートされます。一方、あなたのread命令が下された。サム満ちる変数: pathactionおよびfilereadデフォルトでは、読み取り行は文字に基づいて分割され、結果IFSトークンは引数で指定された名前に割り当てられます。最初のトークンは最初の名前に割り当てられ、2番目のトークンは2番目の名前などです。 (そして、2番目の名前の後に名前よりもトークンが多い場合、残りのトークンはすべて姓に割り当てられます。)

簡単に確認できるように、コードで監視イベントをトリガーするすべてのファイルのフルパスが割り当てられますpath(スペース文字が含まれていない場合)。

$ inotifywait -m --format "%w%f" -e create -e moved_to /tmp/test |
  while read path action file; do
    printf 'path: "%s"; action: "%s"; file: "%s"\n' "$path" "$action" "$file"
  done
# Type "touch /tmp/test/foo" in a different terminal
path: "/tmp/test/foo"; action: ""; file: ""

しかも記事にも出ているようにその他の回答署名されたQ&Aでは、聞くのではclose_writeなくイベントを聞く必要がありますcreate。あなたが探しているものは次のとおりです。

inotifywait -m -q --format "%w%f" -e close_write -e moved_to -- "$dir" |
  while IFS= read -r src; do
    if [ "${src##*.}" = 'txt' ]; then
      mv -- "$src" "$target"
    fi
  done

-rreadバックスラッシュエスケープシーケンスを解釈しないように指示します。ファイル名の末尾の空白文字が切り捨てられるのをIFS=防ぐために使用されますread(名前がスペースまたはタブで終わる場合を処理するため)。

名前に改行文字が含まれているファイルはまだ失敗します。

関連情報