HylaFax は、スプールフォルダに約 1 週間分のファックス転送履歴を保存します。ファイルを繰り返し、ユーザー数とページ数を抽出してログに出力するスクリプトがあります。
ログファイルに重複出力を発生させずに処理されたファイルを移動/変更せずに、毎日フォルダ内のファイルを処理する最も効率的な方法は何ですか?
フォルダの説明:
# ls /var/spool/hylafax/doneq/
q10000 q10001 ... q10010
スクリプト
#!/bin/bash
for i in /var/spool/hylafax/doneq/q*
do
user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
pgs=$(cat $i | grep "npages" | sed 's/npages://g')
echo "$i $user - $pgs pages" >> /scripts/log_output.txt
done
答え1
頼む
ログファイルに重複出力を発生させずに処理されたファイルを移動/変更せずに、毎日フォルダ内のファイルを処理する最も効率的な方法は何ですか?
これを達成する1つの方法は、処理されたファイルのソートされたリストを保存することです。comm
候補ファイルのリストとして処理すると、重複エントリが削除されます。
技術の例として、次のようなものが正しい形式のファイル名(HylaFaxで生成された名前など)を処理するための基礎として使用できます。
find * -print | sort > /tmp/current_files
test -f /tmp/previous_files || { echo "Come back tomorrow"; exit 0; }
comm -13 /tmp/previous_files /tmp/current_files > /tmp/new_files
# ... Process entries in /tmp/new_files ...
mv -f /tmp/current_files /tmp/previous_files
答え2
これはあまりエレガントな解決策かもしれませんが、これが私が思いついたものです:
#!/bin/bash
processed=$(cat /scripts/processed_log.txt)
for i in /var/spool/hylafax/doneq/q*
do
case "${processed[@]}" in
*"$i"*) ;;
*) echo "New! Going to add $i to the log"
echo $i >> /scripts/processed_log.txt
user=$(cat $i | grep "mailaddr" | sed 's/mailaddr://g')
pgs=$(cat $i | grep "npages" | sed 's/npages://g')
echo "$i $user - $pgs pages" >> /scripts/log_output.txt
;;
esac
done
スプールディレクトリに存在しなくなったprocess_log.txtのファイルを削除するロジックを追加するだけです。 sedはこの問題をうまく解決しなければなりません。