プロが教える店舗&オフィスのセキュリティ対策術

複数のファイルをdiffで比較するために以下のシェルを作成しましたが
diff: 「ファイル名」の後のオペランドがありません
とエラーが表示されてしまいます。
htmlディレクトリとhtml_bkディレクトリ内にある
ファイルを比較する処理になります。

========================================
find ./html -name *.html -type f |
while read f
do

echo $f | sed 's/html/html_bk/g' $temp
diff $f $temp >> diff.txt

done
======================================
$tempの中身はhtml_bkと変更されていました。

原因が分かる方がいましたら教えてください。

A 回答 (2件)

> htmlディレクトリとhtml_bkディレクトリ内にある


> ファイルを比較する処理になります

diff -r html html_bk
で一発なんですけど....


このシェルスクリプトを完成させるなら

# -nameで*を使いたいときは""で括る
find ./html -name "*.html" -type f |
while read f
do
# 実行結果を変数に取り込むならバッククオートを使う
# 先頭が必ず ./html/ になるから、htmlを置き換えればいいのだけど、
# より正確にするなら、こんな感じ
temp=`echo $f | sed 's|^\./html/|./html_bk/|'`

# ファイル名の空白が含まれることも考慮して、""で括る
diff "$f" "$temp" >> diff.txt
done
    • good
    • 0
この回答へのお礼

kmeeさん、返答ありがとうございます。
教えて頂いたとおりに書いたら動きました。
それに、-rオプションという便利なものがあったんですね。
丁寧に教えてもらったおかげで注意する点や勉強不足がはっきりと
分かりました。
ありがとうございました。

お礼日時:2010/06/23 19:12

いろいろ問題あるなぁ....


・「$tempの中身はhtml_bkと変更されていました。」と書かれていますが, temp を変更している部分が見当たりません. 「更新されていた」というのはどのように確かめたのですか?
・*.html はクォートしないとまずい
・sed で置換する時になぜ g をつけている?
・そもそもこれはシェルスクリプトであってシェルではない

この回答への補足

Tacosanさん返答ありがとうございます。

変更内容は、echo $tempで画面に出力させて確認したのですが
確認の方法が間違っていましたでしょうか?

htmlのクウォーとsedのgに関しては、記述が間違っておりました。
原因が分からなかったので、いろいろ試していた際に間違った記述をコピーしてしまいました。

シェルについては、痛いご指摘です。
何せほとんど書いたことがありませんので良くわかっておりません。

補足日時:2010/06/23 17:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!