、ここ(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)
あなたはそれについて間違った道を進んでいます。'/ home/bm961355/Desktop /'のファイルを見るために 'inotifywait'を使い、変更されたファイルを' diff'したいでしょう。 –
そのplsについてもっと教えていただけますか?これは、1つのファイルをチェックしたときにそのサンプルを使ってその本を実行したことに基づいており、その本にはこれらのコマンドが含まれていませんでした。 –
ディレクトリの変更を監視するのは簡単です。あなたの質問の難しい部分は、比較するファイルのオリジナルを持たずに、ファイル内のどの行が変更されたかを判断することと関係しています。あなたの '[-N" file "]'はディレクトリ内のすべてのファイルに適用されなければならず、trueの場合、元のファイルがないために何が新しくなったのか変更されたのかを知る方法がありません。行が追加または削除されたかどうかだけを知りたければ、各ファイルの 'wc -l'値の配列を保持することができます(しかし、それは無駄に思えます)。もしあなたが好きなら、私は 'inotifywait'の例を挙げます。 –