1

私はこのbashスクリプトを持っています:

#!/bin/bash


inotifywait -m -e close_write --exclude '\*.sw??$' . |
#adding --format %f does not work for some reason
while read dir ev file; do
        cp ./"$file" zinot/"$file"
done
~

さて、同じことを行うだけでなく、ファイル名をログ ファイルに書き込むことで削除を処理するにはどうすればよいでしょうか。何かのようなもの?

#!/bin/bash


inotifywait -m -e close_write --exclude '\*.sw??$' . |
#adding --format %f does not work for some reason
while read dir ev file; do
        # if DELETE, append $file to /inotify.log
        # else
        cp ./"$file" zinot/"$file"
done
~

編集:

CLOSE_WRITE,CLOSE生成されたメッセージを調べたところ、ファイルが閉じられるたびに inotifywait が生成されることがわかりました。それが今、自分のコードでチェックしているものです。もチェックしようとしましDELETEたが、何らかの理由でコードのそのセクションが機能していません。見てみな:

#!/bin/bash

fromdir=/path/to/directory/
inotifywait -m -e close_write,delete --exclude '\*.sw??$' "$fromdir" |
while read dir ev file; do
        if [ "$ev" == 'CLOSE_WRITE,CLOSE' ]
        then
                # copy entire file to /root/zinot/ - WORKS!
                cp "$fromdir""$file" /root/zinot/"$file"
        elif [ "$ev" == 'DELETE' ]
        then
                # trying this without echo does not work, but with echo it does!
                echo "$file" >> /root/zinot.txt
        else
                # never saw this error message pop up, which makes sense.
                echo Could not perform action on "$ev"
        fi

done

dirでは、私はそうしますtouch zzzhey.txt。ファイルがコピーされます。私はそうしvim zzzhey.txt、ファイルの変更がコピーされます。rm zzzhey.txtファイル名がログ ファイルに追加されますzinot.txt。素晴らしい!

4

1 に答える 1

2

-e deleteモニターに追加する必要があります。そうしないと、DELETEイベントがループに渡されません。次に、イベントを処理するループに条件を追加します。このようなことをする必要があります:

#!/bin/bash

inotifywait -m -e delete -e close_write --exclude '\*.sw??$' . |
while read dir ev file; do
  if [ "$ev" = "DELETE" ]; then
    echo "$file" >> /inotify.log
  else
    cp ./"$file" zinot/"$file"
  fi
done
于 2012-11-17T11:32:22.053 に答える