2016-04-08 14 views
1

ファイルが変更されているかどうかを確認しています。追加された新しい文字列をエコーする必要があります。私はこのスクリプトを1つのファイルに対して試してみると動作しますが、ディレクトリ内の複数のファイルを繰り返し処理するときにはうまくいきません。なにか提案を?コメントに引き続きファイルに加えられた変更をエコーできない

#! /bin/bash 

GAP=5 

while : 
do 
    FILES=/home/Desktop/* 
    for f in $FILES 
    do 
     len=`wc -l $f | awk '{ print $1 }'` 

     if [ -N $f ]; then 
      echo "`date`: New entries in $f:" 
      newlen=`wc -l $f | awk '{ print $1 }'` 
      newlines=`expr $newlen - $len` 
      tail -$newlines $f 
      len=$newlen 
     fi 
     sleep $GAP 
    done 
done 
+0

あなたはそれについて間違った道を進んでいます。'/ home/bm961355/Desktop /'のファイルを見るために 'inotifywait'を使い、変更されたファイルを' diff'したいでしょう。 –

+0

そのplsについてもっと教えていただけますか?これは、1つのファイルをチェックしたときにそのサンプルを使ってその本を実行したことに基づいており、その本にはこれらのコマンドが含まれていませんでした。 –

+0

ディレクトリの変更を監視するのは簡単です。あなたの質問の難しい部分は、比較するファイルのオリジナルを持たずに、ファイル内のどの行が変更されたかを判断することと関係しています。あなたの '[-N" file "]'はディレクトリ内のすべてのファイルに適用されなければならず、trueの場合、元のファイルがないために何が新しくなったのか変更されたのかを知る方法がありません。行が追加または削除されたかどうかだけを知りたければ、各ファイルの 'wc -l'値の配列を保持することができます(しかし、それは無駄に思えます)。もしあなたが好きなら、私は 'inotifywait'の例を挙げます。 –

答えて

2

、ここ(inotify-toolsパッケージから)私はinotifywaitを使用して想定される元の溶液と連想配列です。ここでの利点はinotifywaitであり、各ループ反復で各ファイルの行数を無限にチェックしてリソースを無駄にしません。私は一時ファイルを使用して解決策を作成しますが、そのルートに行くときは、ループの繰り返しの間に発生する変更まで自分自身を開きます。

#!/bin/bash 

watchdir="${1:-$PWD}" 
events="-e modify -e attrib -e close_write -e create -e delete -e move" 
declare -A lines 

for i in "$watchdir"/*; do 
    [ -f "$i" ] && lines[$i]=$(wc -l <"$i") 
done 

while :; do ## watch for changes in chosen dir 
    fname="${watchdir}/$(inotifywait -q $events --format '%f' "$watchdir")" 
    newlc=$(wc -l <"$fname") ## get line count for changed file 
    if [ "${lines[$fname]}" -ne "$newlc" ]; then ## if changed, print 
     printf " lines chanaged : %s -> %s (%s)\n" \ 
     "${lines[$fname]}" "$newlc" "$fname" 
     lines[$fname]=$newlc ## update saved line count for file 
    fi 
done 

オリジナルTESTFILE.TXT

$ cat dat/tmp/testfile.txt 
1 1.2 
2 2.2 

使用例/出力watchdir.shに保存さ

スクリプト:ここで最初のソリューションです。 watchdir.sh起動しそうinotifywaitは、第二の端子を使用して

$ ./watchdir.sh dat/tmp 

dat/tmpディレクトリを見ている、dat/tmpディレクトリ内のファイルを変更

$ echo "newline" >> ~/scr/tmp/stack/dat/tmp/testfile.txt 
$ echo "newline" >> ~/scr/tmp/stack/dat/tmp/testfile.txt 

別の端末(またはバックグラウンド)で実行されているwatchdir.shの出力

$ ./watchdir.sh dat/tmp 
lines chanaged : 2 -> 3 (dat/tmp/testfile.txt) 
lines chanaged : 3 -> 4 (dat/tmp/testfile.txt) 

結果testfile.txt

01ここでは[-Nファイル]

を使用して

$ cat dat/tmp/testfile.txt 
1 1.2 
2 2.2 
newline 
newline 

第2の解決策は、あなたの最初の試みに少し近い第二の溶液です。ソリューションに近づけるのはあまり堅牢ではありません(テスト間の複数の変更がないなど)。以上のことを見て、あなたが質問がある場合は私に知らせて第二の端子に

$ ./watchdir2.sh dat/tmp 

は、ファイルを変更watchdir.sh

#!/bin/bash 

watchdir="${1:-$PWD}" 
gap=5 
tmpfile="$TMPDIR/watchtmp" ## temp file in system $TMPDIR (/tmp) 
:>"$tmpfile" 

trap 'rm $tmpfile' SIGTERM EXIT ## remove tmpfile on exit 

for i in "$watchdir"/*; do  ## populate tmpfile with line counts 
    [ -f "$i" ] && echo "$i,$(wc -l <"$i")" >> "$tmpfile" 
done 

while :; do         ## loop every $gap seconds 
    for i in "$watchdir"/*; do    ## for each file 
     if [ -N "$i" ]; then    ## check changed 
      cnt=$(wc -l <"$i")    ## get new line count 
      oldcnt=$(grep "$i" "$tmpfile") ## get old count 
      oldcnt=${oldcnt##*,} 
      if [ "$cnt" -ne "$oldcnt" ]; then ## if not equal, print 
       printf " lines chanaged : %s -> %s (%s)\n" \ 
       "$oldcnt" "$cnt" "$i" 
       ## update tmpfile with new count 
       sed -i "s|^${i}[,][0-9][0-9]*.*$|${i},$cnt|" "$tmpfile" 
      fi 
     fi 
    done 
    sleep $gap 
done 

使用/出力

スタート

$ echo "newline" >> ~/scr/tmp/stack/dat/tmp/testfile.txt 

$gapが期限切れになるのを待つ(変更された場合)二回 - それは登録されません)

$ echo "newline" >> ~/scr/tmp/stack/dat/tmp/testfile.txt 

結果

$ ./watchdir2.sh dat/tmp 
lines chanaged : 10 -> 11 (dat/tmp/testfile.txt) 
lines chanaged : 11 -> 12 (dat/tmp/testfile.txt) 
+0

これはうまく見えますが、これは私が必要とするものではないと思います。明らかに、あなたはプログラム 'inotifywait'をインストールする必要があるからです。私は[N- $ f] –

+0

@ J.Doeにこだわるべきでしょうか本当ですか?これは、最終的に 'inotifywait'でロバストに解決される粘着性の問題です。もしあなたがシェルスクリプトを使いたいのであれば、あなたはヤクシェイビングビジネスで素晴らしい仕事をしています。 – tripleee

+0

@トリプルリー私は[-N $ f]へのこだわりが良いと言っているわけではありませんが、私はそれに従う必要があります。これまでの私の本では、「inotifywait」という言葉は一度も言及されていませんが、私の教授がこの解決策に同意するとは思えません。 –

関連する問題