inotifywait
監視ディレクトリに close_write フラグがあることを確認すると、ファイルやフォルダに対して他のタスクを実行するためにスクリプトをインポートしようとしましたが、スキャンが正しく機能しないようです。
私は他のスクリプトでこのタイプのチェックを使用してきましたが、うまくいきますが、inotifywait
まだ理解していないものがあるようです。
現在の形式のスクリプトは次のとおりです。
#!/bin/bash
dir1=/sambashares
while true; do
inotifywait -r -e close_write "$dir1" | while read f; do
#debug
echo $f
#Is it a directory?
if [[ -d "${f}" ]]; then
#debug
echo "New directory called ${f} detected"
chown -R jake:jake $f
chmod -R 775 $f
cp -R $f /media/lacie/Film
fi
#Is it a file?
if [[ -f "${f}" ]]; then
#debug
echo "New file called ${f} detected"
chown jake:jake $f
chmod 775 $f
cp $f /media/lacie/Film
fi
done
done
何が起こっているのかを確認するために端末でこれを実行すると、私が得るものはclose_writeが検出されたという確認と「set watch」が続きます。他のメッセージや他のコードはトリガーされず、直接デバッグエコーも発生しません。従業員:
while read f; do
:-(
Ubuntu Server 12.04 LTS 64ビットで実行しています。
$ bash --version
GNU bash, version 4.2.25(1)-release (x86_64-pc-linux-gnu)
$ dpkg -l | grep inotify
ii inotify-tools 3.13-3
ii libinotifytools0 3.13-3
ii python-pyinotify 0.9.2-1
$ python --version
Python 2.7.3
ベストアンサー1
以下は私にとって効果的でした。
はい
inotifywait
独自の方法と同様の方法を使用する例を以下に示します。
$ inotifywait -r -e close_write "somedir" | while read f; do echo "$f hi";done
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
その後、ディレクトリに移動してsomedir
ファイルをタッチすると、ウィンドウで次のことが起こりますtouch afile
。inotifywait
somedir/ CLOSE_WRITE,CLOSE afile hi
メモ:すべての出力を取得するには、inotifywait
例を少し変更するだけです。
$ inotifywait -r -e close_write "somedir" 2>&1 | \
while read f; do echo "$f | hi";done
Setting up watches. Beware: since -r was given, this may take a while! | hi
Watches established. | hi
コマンドを使用してファイルをもう一度タッチすると、touch afile
イベントが表示されます。
somedir/ CLOSE_WRITE,CLOSE afile | hi
これを使用する方法を示す別の例については、inotifywait
このQ&Aに対する回答で私が示した例をご覧ください。ファイルがサイズ制限に達すると自動的に検出。
あなたの問題
私の考えであなたが経験している問題のいくつかは、返された出力がファイル名にすぎないとinotifywait
仮定していますが、上記の例では明らかにそうではありません。
したがって、次のif
文は決して成功しません。
if [[ -d "${f}" ]]; then
and
if [[ -f "${f}" ]]; then
これらのBashスクリプトを開発するときは、上部の次のコマンドでデバッグメッセージを有効にすることが役に立つことがよくあります。
set -x
次の方法で無効にできます。
set +x
このメッセージを使用して、コードセクションをラップしてオンまたはオフにすることができます。
set -x
...code...
set +x