• ベストアンサー
  • すぐに回答を!

シェルでファイルのハッシュを取得する方法

シェル(.shのファイル)でフォルダに格納されている複数のファイルからファイル名、ハッシュをとって HASH.txtというファイルに以下のようなレイアウトで作りたいのです。  ファイル名,ハッシュ     ・     ・ MD5というコマンドをつかえばハッシュがとれることは わかったのですが、これをどのようにファイルに書き込んでいくのか 方法がわかりません。 当方、UNIXをつかうのも初めてでどうしたらよいのか全然わかりません。(依頼してきた人も長期休暇中で困ってます) どこかサンプルや、解説があるようなHPでも構わないので どなたか教えてください。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1837
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1

OSが何でmd5というコマンドの出力形式も分かりませんが、とりあえず手元にあるSolarisで同じようなことをするのであれば、 cshで foreach h (*) echo $h","`digest -a md5 $h`|tee -a /tmp/digest end とかするとできますが・・・ shやbash等では foreach h (*) とendの代わりに for h in $(ls);do とdoneを使って、 for h in $(ls);do echo $h","`digest -a md5 $h`|tee -a /tmp/digest done とかやるとできました。 おそらく、このdigest -a md5 の箇所をmd5というコマンドに置き換えるといいのだと思います。 とりあえず、コマンドに意味は カレントディレクトリにあるすべてのファイルに対して echo…のコマンドを実行する。 echoのところの意味は まずファイル名を表示し、","の後にdigestコマンドで出力されたmd5ハッシュ値を表示し、|teeで 表示されている実行結果を「/tmp/digest」というファイルに書き出すという内容です。 細かい使い方はそれぞれのコマンドを検索すると簡単に出てくると思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

早速の回答ありがとう御座います OS等は・・・すみません忘れました。。 いきなり振られてきてなんだか良くわからず、 現状あるプログラムしか眺めていなかったので・・・。 休み明けに調べてきます

質問者からの補足

訂正 Linuxでした。 また、色々調べ以下のよう中たちで進めています。 #ハッシュ情報をいれるファイルを作成 mktemp ${B8_DATA_DIR}/HASH.txt ハッシュ情報取得 md5sum ${B8_DATA_DIR}/xxx1.csv | awk '{printf("%s,%s\n",$2,$1)}' > ${B8_DATA_DIR}/B8HASH.txt 上記やり方だとHASH.txtに以下のように登録できました。 xxx1.csv,a7as8as9a8s9a8… 今回、3つのファイルの情報がとりたいので色々試していますがうまくいきません (1)単純に羅列 md5sum xxx1.csv | awk '{printf("%s,%s\n",$2,$1)}' > HASH.txt md5sum xxx2.csv | awk '{printf("%s,%s\n",$2,$1)}' > HASH.txt md5sum xxx3.csv | awk '{printf("%s,%s\n",$2,$1)}' > HASH.txt 結果、HASH.txtに最後の行だけしか登録されなかった (ハッシュの表記は適当です) xxx3.csv,a7as8as9a8s9a8… (2)for文を使う for arg in xxx1.csv xxx2.csv xxx3.csv do echo md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' > HASH.txt done 結果、HASH.txtに最後の行だけしか登録されなかった。 さらにハッシュ情報がとれなかった xxx3.csv,md5sum 希望はHASH.txtに以下のように登録できることです。 xxx1.csv,a7as8as9a8s9a8… xxx2.csv,s898wede8s9asa… xxx3.csv,d98de87d7ss7as… どなたかご助言お願い致します。

関連するQ&A

  • シェルの中からシェルを呼び出して判定

    UNIXで以下のようなシェルが動作しております。 #!/bin/sh su abcdef -c './GHI'; err=$? if [! $err -eq 0 ] then echo エラーが発生しました fi exit このシェルは「abcdef」ユーザに移ってカレントディレクトリのシェルコマンド「GHI」の結果を判定するというものです。 UNIX上では問題なく動作しております。 これをLinuxでそのまま動作させると「err」に「su abcdef」というユーザ切替コマンド自身の正否を格納しているようです。 「'」でくくられた範囲内で結果をファイルに格納したりして、その後ファイルの中を見て判断するとうまくいくことは分かっておりますが、出来たらファイルなど使いたくありません。 このような場合、みなさんどうしてるんでしょうか? よく出てくるパタンだと思うのですがどうしても良い対処が見つかりません。 どうか宜しくお願いします。 Linuxは「miracle-Linux2.0」というOSです、いわゆるRedHat系です。

  • UNIXのシェル

    シェルに関して質問です。 0526とか0525のところは一日ごとにフォルダが作成されます。 unix\yasu\0526\hobby\test.txt unix\yasu\0526\hobby\test.txt unix\tomo\0525\hobby\test.txt unix\tomo\0525\hobby\test.txt ./check.sh MMDD 実行するときにMMDDのところに日付を入れてフォルダがあればコマンド1を実行するようにしたいです。 引数に指定した文字を判定するにはどうしたらいいのでしょうか? よろしくお願いします。 ----------------------------- #シェルの名前は「check.sh」です #! /bin/sh if [ $1 = "日付" ] ; then コマンド1 else コマンド2 fi -----------------------------

  • サブルーチンでファイルの内容をハッシュに格納したい。

    次のようなファイルA.txtが有った場合に、ファイルを読み込んで、その内容をハッシュに展開したいと考えています。できれば、サブルーチン化して、引数で渡したハッシュに格納したいのですが、どうすればよいでしょうか? 教えてください。 ----- hoge1 10 hoge2 20 hoge3 30

    • ベストアンサー
    • Perl
  • シェルでファイルの最下行を削除する方法

    シェルでファイルの最下行を削除する方法 シェルで、ファイルaaa.txtの最下行を削除したいです。これを1行で実現したいです。 exには-cってオプションがあるので、ex -c '$d' aaa.txt などと試してみましたがダメでした。 ;(コロン)や&&でつなぐのは、1行ではないって事でお願いします。 >cp aaa.txt tmp && sed '$d' tmp >aaa && rm tmp #こういうのは無しって意味です。 事前にスクリプトや、それ専用のバイナリを用意しておくのも無しでお願いします。なるべく汎用的な どこのUNIXにでもあるようなコマンドで実現したいです。

  • シェルでファイルから1行づつ読み出す。

    ファイルから1行づつ読み込んで 変数に格納する方法がわかりません。 具体的に言うと・・・ ユーザIDが詰まった(1行に一人分)ファイル user.txt を1行づつ読みこんでいき、 ユーザアカウントをチェックするプログラム user_chk に引数として渡して行きたいと思っています。 簡単だと思っていたのですが、 さっぱりわかりません。 Cシェルを使用していますが、 Bシェルでもかまいません。

  • コマンドの結果をシェルの配列に格納する方法

    cat test.txtのような、コマンドの結果が次のようなとき、うまくこれらをシェルの配列に格納する方法はありますか? ('3','9','11') ちなみに、'3'のような形ではなく、単純に3と格納されるようにしたいです。 できたらsedなど、正規表現を使わない方法を教えて頂きたいです。 宜しくお願い致します。

  • ファイル内の改行を削除し1行にするシェル

    お世話になっております。 ファイル(テキスト)内には、改行を含んだ複数の行が記述されています。 これを1行にして上書き保存するシェルを実行をするための シェルを作成したいと思っています。 ファイル内には以下のような値が改行を含んで入っています。 123 456 789 →これを、「123456789」と改行を取り除き、既存のファイルの上書き保存をしたい なお、改行を含んだ対象のファイルは、ファイル名にある文字を含む ファイルのみに対して行いたいのですが。 例:ファイル名に、「*abc*」、「*def*」、「*xyz*」を含むファイルが対象 改行を取り除くコマンドはわかるのですが、シェルにするプロセスがわかりません。 cat 入力ファイル名 | tr -d '\n' > 変換後の出力ファイル名 ご教授いただきたく、よろしくお願いします。

  • unixのシェルでファイル内容を読み込む

    ど初心者です。わかりづらいかもしれませんが宜しくお願いします。 以下のような処理を行いたいと考えています。 (1) aaa.sh(シェルスクリプト)にてバッチプログラムを起動 (2)バッチでエラーの場合、結果ファイル(bbb.txt)に「1」を出力する。 (3)aaa.sh(シェルスクリプト)にて結果ファイルの内容を読み取り「1」の場合は、再度バッチプログラムを起動する。 このうち(3)の処理にて、結果ファイルの読み込み方法がわかりません。 調べた結果、以下のような処理で可能なようですが・・ while read LINE; do echo $line done < aaa.txt 読み込むのは1行なので、ループ処理にはしたくないのですが、例えば「read LINE aaa.txt」のような簡単なコマンドで、ファイルの中身を読み込むことはできないのでしょうか? 実はUNIXが初めてで、しかもスケジュールに余裕がないため焦っております。 なにぶん知識不足な故、ちんぷんかんぷんな質問かも知れませんが、よろしくお願いいたします。

  • ローカルネット内にてファイルをシェルで転送するには?

    初投稿させて頂きます。 パソコンが最近不安定なので、バックアップとして定時にローカルネット内の他機へファイルを転送するシェルを作りたいと考えています。 流れは、 #!/bin/bash sftp 他機のローカルアドレス ユーザー名 パスワード put file.txt こういうイメージなんですがアカウントとパスを入力するところで躓いています。検索してもUNIXのコマンド(user等)しか引っかかりませんでしたので、linuxで使える良いコマンドはありませんか。 環境はCentos5です。どうぞよろしくお願いします。

  • シェルで12時間前のファイルを消す方法

    こんにちは。UNIX(HP-UX)のPOSIXシェルで質問です。 指定したフォルダの中の「現在時刻より12時間前のタイムスタンプのファイルを消す」方法はないでしょうか? findコマンドは24時間の倍数しか検索できないので、12時間前は指定できません。 12時間以上前のファイルは、すべて消えてかまいません。(例えば15時間前のファイルなど) できれば抽象的な説明ではなく、具体的で、すぐに動くコーディングを記述して下さると助かります。 以上宜しくお願い致します。