2011-09-24 11 views
19

私は、ディレクトリを監視し、 "EE"を含む行を削除してすべての新しいファイルを変更するinotify-toolsでbashスクリプトを作成しようとしています。変更すると、ファイルを別のディレクトリに移動しますinotifyとbash

#!/bin/sh 
    while inotifywait -e create /home/inventory/initcsv; do 
     sed '/^\"EE/d' Filein > fileout #how to capture File name? 
     mv fileout /home/inventory/csvstorage 
    fi 
    done 

助けてください?デフォルトでは

答えて

18

inotifywait -e CREATEからのテキスト出力は、フォーム

watched_filename/home/inventory/initcsvevent_filename新しいファイルの名前を表しを表し
 watched_filename CREATE event_filename 

です。

DIR=/home/inventory/initcsv 
    while RES=$(inotifywait -e create $DIR); do 
     F=${RES#?*CREATE } 

をしてFilein名前としてあなたのsed回線使用$F中:

だから、あなたのwhile inotifywait -e ...ラインの代わりに、置きます。 $(...)構成は、プロセス置換のposix互換形式です(多くの場合、バックティックを使用して実行されます)。の結果は、$RESに等しく、最短パターン一致接頭辞は削除されます。パターンの最後の文字は空白であることに注意してください。 sedの回線使用"$F"の代わり$Fで、空白文字を含むことができ、ファイル名を処理するために

アップデート1 [2を更新参照してください]。つまり、Fという値の参照を二重引用符で囲みます。

RES=...F=...の定義では、二重引用符を使用する必要はありませんが、必要に応じて使用することもできます。たとえば、F=${RES#?*CREATE }F="${RES#?*CREATE }"は、空白を含むファイル名を扱うときにどちらもうまく動作します。

更新2 Daanのコメントに記載されているように、inotifywaitには、出力形式を制御する--formatパラメータがあります。

Setting up watches. 
Watches established. 
RES is a at Tue Dec 31 11:37:20 MST 2013 
Setting up watches. 
Watches established. 
RES is aaa at Tue Dec 31 11:37:21 MST 2013 
Setting up watches. 
Watches established. 
RES is aaaa at Tue Dec 31 11:37:22 MST 2013 
Setting up watches. 
Watches established. 
+0

'--format%w'オプションを使用して出力するだけでは、ファイル名だけしか使用できないのはなぜですか? – Daan

+0

@ Daan、はい、それは意味があります(%fでは%wではありません)。 update 2を参照してください。 –

+0

'inotifywait -e delete_self aSymlinkFilename'は、シンボリックリンクが削除された場合にのみ、実際のファイルが削除された場合には動作しません:(また、-mスイッチを使用している場合は –

1

inotifywaitのmanページを引用:コマンドで

while RES=$(inotifywait -e create $DIR --format %f .) 
    do echo RES is $RES at `date`; done 

は別の端末で実行中の一方の端子とコマンド

touch a aa; sleep 1; touch aaa;sleep 1; touch aaaa 

で実行して、次の出力は、第1端子に登場しました:

inotifywait will output diagnostic information on standard error and event information on 
    standard output. The event output can be configured, but by default it consists of lines 
    of the following form: 

    watched_filename EVENT_NAMES event_filename 

    watched_filename 
      is the name of the file on which the event occurred. If the file is a directory, a 
      trailing slash is output. 

つまり、ファイルの名前を標準出力に出力します。だから、あなたは標準出力からそれらを読んで、あなたがしたいことをするためにそれらを操作する必要があります。 inotifywaitから

8

出力の形式は次のとおりです。

filename eventlist [eventfilename] 

あなたのファイル名にスペースやカンマを含めることができる場合、これは解析がトリッキー取得します。

srcdir=/home/inventory/initcsv 
tgtdir=/home/inventory/csvstorage 
inotifywait -m -e create "$directory" | 
while read filename eventlist eventfile 
do 
    sed '/^"EE/d'/' "$srcdir/$eventfile" > "$tgtdir/$eventfile" && 
    rm -f "$srcdir/$eventfile 
done 
+1

+1です。変更を監視しないでください。スクリプトは、前のファイルが処理されている間にアップロードされたファイルを処理しません。 – frnknstn

+0

これは本当に素晴らしいソリューションです。 – sleepycal