Ubuntu 20.04を使用しています。このスクリプトを実行しようとしていますinotifywait
。アイデアは、ディレクトリが変更されるたびにファイルを移動することですdir
。target
スクリプトは、コマンドラインから自動または手動で起動できるシェルファイルです。
#!/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クライアントを使ってファイルを置き、dir
inotifyがファイルを移動するのを待つと、target
ファイルに何も起こりません。
私はこれを参考にしています:https://unix.stackexchange.com/a/86292/425161
答え1
残念ながら、このinotify
APIはリモートファイルシステムを監視するためには使用できません。
~からman 7 inotify
:
Inotifyは、ファイルシステムAPIを介してユーザースペースプログラムによってトリガーされたイベントのみを報告します。したがって、ネットワークファイルシステムで発生するリモートイベントをキャプチャしません。 (アプリケーションはこれらのイベントをキャプチャするためにファイルシステムポーリングに置き換える必要があります。)
関連質問:
- リモートファイルシステム(特にWebDAV)でinotifyを使用する方法はありますか?
- SSHFS経由でマウントされたフォルダの監視
- SSHFSを介してinotifyまたは名前付きパイプを使用する方法は?
つまり、あなたの質問のスクリプトは期待どおりに機能しません。
"%w%f"
asの出力形式を使用するアイデアは、inotifywait
リスニングされたファイルシステムイベントをトリガーしたファイルへのフルパスをループ内のコマンドに提供することです。監視対象ファイルのパス%w
($dir
ディレクトリ)と%f
イベントを発生させたファイルの(デフォルト)名に展開されます。
したがって、inotifywait
キャプチャする各イベントに対してフルパスのみがエクスポートされます。一方、あなたのread
命令が下された。サム満ちる変数: path
、action
およびfile
。read
デフォルトでは、読み取り行は文字に基づいて分割され、結果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
-r
read
バックスラッシュエスケープシーケンスを解釈しないように指示します。ファイル名の末尾の空白文字が切り捨てられるのをIFS=
防ぐために使用されますread
(名前がスペースまたはタブで終わる場合を処理するため)。
名前に改行文字が含まれているファイルはまだ失敗します。