シェルスクリプトでmd5sumを計算してファイルを比較する方法

このQ&Aのポイント
  • シェルスクリプトを使用して2つのファイルのmd5sumを計算し、比較する方法について説明します。
  • シェルスクリプトでmd5sumを使用し、2つのファイルのmd5ハッシュ値を取得します。その後、取得したハッシュ値を比較してファイルの一致を確認します。
  • シェルスクリプトでmd5sumを計算してファイルの一致を確認する方法について説明します。md5sumコマンドを使用してファイルのmd5ハッシュ値を取得し、取得したハッシュ値を比較することで、ファイルの一致を判定します。
回答を見る
  • ベストアンサー

シェルスクリプトでmd5sum

シェルスクリプトでmd5sumを計算して2つのファイルを比較しようとしています。 /bin/sh # ファイル名を出力 echo "fileout1_${file1DirFile}"→/var/log/httpd.log 入っています。 echo "fileout2_${file2DirFile}"→/root/httpd.log 入っています。 #-- MD5値取得 file1DirFileMD5=`md5sum ${file1DirFile} | awk '{printf("%s",$1)}'` file2DirFileMD5=`md5sum ${file2DirFile} | awk '{printf("%s",$1)}'` この後、ifで「file1DirFileMD5」と「file2DirFileMD5」比較。 <質問> #-- MD5値取得 の部分の下二行で、シェルスクリプトが止まります。 止まる原因が分からないのです。(処理が進まず、止まったままになります) 原因がわからず困っております。 別の書き方でも構わないので、解決方法はないでしょうか。 ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ballville
  • ベストアンサー率47% (233/487)
回答No.2

awkはパイプ入力がなければ入力を待ち続けます(とまってしまい ます)。 md5sumは引数がなければ 入力を待ち続けます(とまってしまいます)。 というわけで 変数${file1DirFile}が、からっぽではないかと疑っています。 file1DirFileMD5=`md5sum ${file1DirFile} | awk '{printf("%s",$1)}'` の行の直前に echo md5sum ${file1DirFile} をいれて出力を確認してください。

kureakai
質問者

お礼

ありがとうございます。 リアルタイムに書き込むファイル(messagesのようなログファイル)があり、 どうもそこでmd5が算出できずに止まっていたようです。 ただ、そのリアル他むファイルを除外してファイル一覧を作成する方法を現在探しています。 情報ありがとうございました。

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.1

sh -x なんとかで実行してなんか分かりませんか?

kureakai
質問者

お礼

ありがとうございます。 リアルタイムに書き込むファイル(messagesのようなログファイル)があり、 どうもそこでmd5が算出できずに止まっていたようです。 ただ、そのリアル他むファイルを除外してファイル一覧を作成する方法を現在探しています。 情報ありがとうございました。

関連するQ&A

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • md5sumファイル比較

    <コマンド> find /var/log/squid/ -type f -exec md5sum {} find /mnt/backup/squid/ -type f -exec md5sum {} にて同じファイルからmd5sumで取得しました。 <結果> ff6bf6f97dc90b05a950015c17fb8146 /var/log/squid/squid.log-20130202.gz ff6bf6f97dc90b05a950015c17fb8146 /mnt/backup/squid/squid.log-20130202.gz 2つのsquid.log-20130202.gz が同じものか比較したいのですが、 前のパス「/var/log/squid/」「 /mnt/backup/squid/」が異なるために 比較しても異なるファイルとみなされます。 cutコマンドでパイプしてみたりしたのですが、 今度は、どちら側のファイルmd5sum結果だったかわからなくなってしまいます。(mntか?varか?) <cut対応> find /var/log/squid/ -type f -exec md5sum {} \; | cut -d "/" -f1,5 →結果:ff6bf6f97dc90b05a950015c17fb8146 /squid.log-20130202.gz <質問> 「/var/log/squid/」「 /mnt/backup/squid/」の部分が異なっていても、 ファイル名(squid.log-20130202.gz)とmd5sum値が同じなら、同じという結果を出すコマンドライン、 またはシェルスクリプトで対応できる方法を探しています。 ご教授お願いします。

  • シェルスクリプトでエラー値取得

    Linuxをつかいシェルスクリプトを組んでいます 複数ファイルの存在有無を確認し、問題なければ、 ファイルを作成する処理を作成したいと思っています。 現在つまずいているのが以下の2点です。  (1)複数ファイルが無い場合、エラーとしたいが、「too many arguments」とででしまう。  (2)HASH.tmp情報取得中にエラーとなったらエラーを出したいが、エラー終了ステータス返却処理に流れない。 初めてで色々しらべながらやっていますが、うまくいかず止まってしまいました。 どなたかご助言お願い致します。 (1) #==============================================================================# # データ抽出用sqlファイル存在確認 # CSVファイルが無かったらエラーを出したい。 # 終了ステータス返却 # 終了ステータスが"0"以外の場合は、"1"を返却する #==============================================================================# if [ ! -f "${DATA_DIR}/"*.csv ]; then # ログ出力 OUT_MSG_LOG -E "抽出ファイルが存在しません。" OUT_MSG_LOG -E "抽出シェル - 終了 終了ステータス :1" OUT_ACT_LOG SH 12 "" OUT_ACT_LOG SH 02 "" exit 1 fi (2) #==============================================================================# # ハッシュ情報取得処理 #==============================================================================# mktemp ${DATA_DIR}/HASH.tmp >/dev/null for arg in *.csv do md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> HASH.tmp done #==============================================================================# # 終了ステータス取得 #==============================================================================# RS=$? #==============================================================================# # エラー終了ステータス返却 # 終了ステータスが"0"以外の場合は、"1"を返却する #==============================================================================# if [ ${RS} -ne 0 ]; then # ログ出力 OUT_MSG_LOG -E "抽出処理実行中にエラーが発生しました。" OUT_MSG_LOG -E "抽出シェル - 終了 終了ステータス :${RS}" OUT_ACT_LOG SH 12 "" OUT_ACT_LOG SH 02 "" exit 1 fi

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • シェルスクリプトについて(POSIX)

    シェルスクリプトを書いていますが、思うように動きません。シェルにお詳しい方がいらっしゃいましたら、ご教授ください。以下のような仕様です。 1.Working dierctoryの中から目的のファイルを検索 2.検出されたファイルの内容を1行ずつ表示させる。 このような簡単な仕様なのですが、awkを使用する必要はありますでしょうか? シェルは初めてなので勉強不足なため、ここで質問するにあたり、情報が不足していましたら、どうぞ補足してください。宜しくお願い致します。

  • シェルスクリプト

    シェルスクリプトに関しては、まったくの初心者です。 OSは、SolarisとLinuxですが、シェルスクリプトを利用して下記のような自動実行プログラムを作りたいのですが、どなたかご教授下さい。 一台のWWWサーバのログ(例:access.log)を、1日に一回(出来ましたら朝の5時)に別サーバに送信するプログラムなのですがいかがでしょうか?このとき、出来れば送信先のファイル名は、送信した日付(例:20020222.log)にしたいです。説明不足かも知れませんが、ひとまずこれでお願いします。

  • 権限の違うシェルスクリプトの実行

    3つのシェルスクリプトがあります。 ●root権限で実行  aaa.csh ●ユーザ指定権限で実行 bbb.csh ●root権限で実行 ccc.csh この3つのシェルスクリプトはaaa.csh →bbb.csh →ccc.cshの順番でバッチ処理として cronに設定したいのですが、 権限が違うのでroot権限のcrontabとユーザ指定のcrontabに それぞれ設定しなくてはいけません。 あまりスマートではないかと思い、 何かよい方法はないかと質問させて頂きました。 3つのシェルスクリプト1つシェルスクリプトにまとめてroot権限のcrontabに設定してしまう方法とかどうでしょうか? ちなみにスクリプトの処理の内容は単純なファイルコピーなどです。 意味分かりますでしょうか? よろしくお願いします。

  • シェルスクリプトでのファイル操作

    Linuxをつかいシェルスクリプトを組んでいます for arg in ${DIR}_/*.csv do md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> ${DIR}/HASH.csv done 上記のような処理でHASH.csvにファイル名とファイルのハッシュ情報を登録しています。 ↓登録されたデータはこんな形になります。  aa/bb/cc/xx.csv,aa339d9idedeeded・・・  aa/bb/cc/ww.csv,aa339d9idedeeded・・・   しかし、このままだとこのパスの部分『aa/bb/cc/』が邪魔なので削除したいと考え 以下のようにしましたが、うまく登録できません。 sed -e "s/\/\(aa\)\/\(bb\)\/\(cc\)\///g" ${DIR}/HASH.csv > ${DIR}/B8HASH.csv >>で出力するようにしたら削除前の下に削除後の情報が追加されてしまいました。 このような場合はどのようにしたら良いのか、ご助言お願い致します。 この方法ではなく、for文の時点で削除できるようであればその方法を教えてください。

  • UNIXでシェルスクリプトを作ることを始めましたが、まだ未熟者です。

    UNIXでシェルスクリプトを作ることを始めましたが、まだ未熟者です。 既存のスクリプトが複数あるのですが、 全てに対して同じ処理を入れ込む必要があります。 入れ込む内容はレイアウトを変更するだけ(awkで書く予定)なので簡単なのですが、 既存スクリプトに全て書き込むのは大変です。 また入れ込んだ処理内容に変更があったときに、全てのスクリプトに変更をひとつひとつ反映させるのは大変です。 入れ込む処理を別ファイルで作成しておいて、 既存スクリプトからはこのファイルを参照するだけにしたいのですが、 どのように書いたらいいのでしょうか?教えてください。

  • シェルスクリプト

    Apache centos6.6 シェルスクリプトの質問です。 shファイルを作りたいです。 home/user/log の中にある access_logとerror_logをgzに圧縮したいです。 条件は1日前のログです。 圧縮した後gzのファイルしか残らないのですが、次のアクセスログとエラーログはちゃんと出力されますか? どうかお願いします