inotifywaitは、ファイルやディレクトリに対してさまざまなことを行います。

inotifywaitは、ファイルやディレクトリに対してさまざまなことを行います。

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 afileinotifywait

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

おすすめ記事