Linuxのシェルスクリプトでディレクトリ内のファイルとMD5値を組み合わせる方法

このQ&Aのポイント
  • Linuxの授業で、ディレクトリ20XX内とディレクトリ20YY内のファイルとの組み合わせのうち、2行目以降の内容が同一の組み合わせを求めるシェルスクリプトの作成方法について教えてください。
  • 問題では、「各ファイル2行目以降のMD5値とファイル名の組をtmp/20XX_tmp.txtにまとめる」という作業が必要です。しかし、どのように行えば良いかわかりません。
  • 既に試した方法として、http://okwave.jp/qa/q5948919.htmlに載っている方法を試してみましたが、うまくいきませんでした。分かる方がいらっしゃれば、教えていただきたいです。
回答を見る
  • ベストアンサー

Linuxについて

Linuxの授業で、 『ディレクトリ20XX内のファイルとディレクトリ20YY内のファイルとの組み合わせのうち、 2行目以降の内容が同一の組み合わせを求めるシェルスクリプトを作成しなさい』 という問題が出ました。 この問題の中で、『各ファイル2行目以降のMD5値とファイル名の組をtmp/20XX_tmp.txtにまとめる』 という作業がありますが、やり方が分かりません。 2行目以降のMD5値をまとめるだけなら、 foreach i (20XX/*.txt) tail -n +2 $i | md5sum >> tmp/20XX_tmp.txt end と入力すればいいのですが....。 また、http://okwave.jp/qa/q5948919.htmlに載っているやり方でやってみても、できませんでした。 分かる人がいたら、是非教えてください。

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

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.1

csh/tcsh が必須なんでしょうか? だとしたらちょっと変わった授業方針だなと思っちゃうんですが・・・ とりあえず、 Ubuntu上のbashとdash/ Cygwin上のbash環境 で次のコードが動きました。 頭の#は外して下さい #for path in `find ./2010/*.txt`; do # echo "$path `tail -n +2 \"$path\" | md5sum | awk '{print $1}'`" #done <おまけ> 他の回答見てればわかりますが、リンク貼られた先の回答者ANo.1さんはいい加減な回答をしない方だと思います。 どういう環境下でどのようにうまく行かないのかを書かれた方がいいでしょう

4151_004
質問者

お礼

迅速なご回答大変有難うございました。 先の回答者ANo.1さんとsholmesさんが教えてくださったやり方で、もう一度挑戦してみようと思います。

その他の回答 (1)

  • sholmes
  • ベストアンサー率81% (89/109)
回答No.2

本文中のインデントまで削られた・・・ こちらで http://ideone.com/PVRIz

関連するQ&A

  • LINUXのcshについて、foreach構文の質問です。

    LINUXのcshについて、foreach構文の質問です。 foreach構文で、foreach i (20XX/*.txt)として、カレントディレクトリ上の20XXフォルダに、テキストファイルが数個はいっているとします。 このとき、テキストファイルすべてのはじめから2行をのぞいてそれ以降の部分からmd5sumでハッシュをとり、その横にファイル名をそれぞれつけたいのですが。。。 とりあえず、 foreach i (20XX/*.txt) cat $i | tail -n +2 | md5sum | sort >> 20XX_hash.txt でハッシュ値がとれることは分かったのですが、、、 コレにいかにしてファイル名を付属できますか? 何か良いアイディアありませんか? よろしくお願いします。 申し訳ないですが、明日までにお願いしますOTL

  • foreachの制御

    ファイルを編集するのにforeachで@allbodyを1行ずつ調べているとします。  foreach $line (@allbody){ $iを含む行があれば$tmpと入れ替えてファイルへ保存   if ($line =~ /$i/){    $line =~ s/.*/$tmp;    print FILE @allbody;   } でも$iを含む行がなければ、新しく追加書き込みをしたい で、上に続けて    else {     push (@allbody,$tmp);     print FILE @allbody;    }   } とやると、おかしい事なりますよねぇ どうすればいいのでしょう?

    • ベストアンサー
    • Perl
  • 一括でファイル名の一部を置換したい

    LinuxのFedora Core 10, シェルにtcshを使用しています。よろしくお願いします。 ======================================================================= 複数のディレクトリ内に、"(from home)"のような文字列を含むファイルがあり、 それらのファイル名から一括で"(from home)"という文字列を取り除きたいのですが ======================================================================= 例えば以下のように、2つのディレクトリ(Directory1,Directory2)の下に、 "(from home)"という文字列を含むファイルが2つずつある場合を考えて、 /Directory1/sample (from home).txt         sample2 (from home).txt /Directory2/ sample3 (from home).txt          sample4 (from home).txt > rename "(from home)" "" `find / -name "(from home)" -print` を試したのですが上手くいかず、 > foreach i (`find / -name "(from home)" print`) foreach? rename "(from home)" "" $i foreach? end でも上手くいきませんでした。 もしかしたらfindコマンドで見つけたファイル名をrenameコマンドに 上手く渡せていないのかと思うのですが、どのようにすれば良いのでしょうか? また別の方法でも、一括でファイル名の一部を変更する方法があれば、 ご教授お願い致します。

  • Bシェルで、1文字づつ読み込み、番地と共に出力する方法を教えてください。

    Bシェルで、1文字づつ読み込む方法を教えてください。 次のように文字が並んでいて、 A B C D E F G H I J K L M N O P それぞれの番地と共に、上記の文字を出力する場合、 どのようにしたら宜しいでしょうか。 入力ファイル:test.txt A B C D E F G H I J K L M N O P ↓ 1 2 3 4 1 A B C D 2 E F G H 3 I J K L 4 M N O P ↓ 出力ファイル A 1 1 B 2 1 C 3 1 D 4 1 E 1 2 F 2 2 G 3 2 H 4 2 I 1 3 J 2 3 K 3 3 L 4 3 M 1 4 N 2 4 O 3 4 P 4 4 番地に関しては、次のシェルを作成しましたが、 test.txtをどのように入力したら良いかが分かりません。 Xmax=4 Ymax=4 yy=1 while [ $yy -le $Ymax ] ; do xx=1 while [ $xx -le $xMax ] ; do echo $xx $yy | awk '{ printf(" %d %d ",$1,$2) }' >>out.txt xx=`expr $xx + 1` done yy=`expr $yy + 1` done 宜しくお願いします。

  • シェルでファイルの最下行を削除する方法

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

  • grepコマンド

    質問させてください。 ファイルから指定した文字列を含まない行を別ファイルに 書き込もうとしています。 gunzip -c tmp.gz | grep -i -v '.txt' > work.txt 上記の場合、tmp.gzを解凍したファイルの行に大文字・小文字関係のない ".txt(Txt, tXt, TxT, ・・・"の文字列を含まない行を  work.txtに書き込んでいます。 これはうまくいったのですが、判定文字列を複数にすると 『ファイルを見つけようとしてエラーがでました』となります。 ちなみにコマンドは gunzip -c tmp.gz | grep -i -v '.txt' -i -v '.log' -i -v '.pdf'> work.txt 複数の大文字小文字を区別しない指定された文字列を含まない行を 別ファイルに書き込むにはどのようにすればいいのでしょうか? すみません、あまり経験がないのでお許しください。 よろしくお願いいたします。

  • 1ファイルずつ読み込みたい

    ウィンドウズ環境でactive perlを利用しています。 あるディレクトリーの中に2000位のファイルが入っており、このファイルを読み込んで置換処理を行うため下記のようなperlを作っています。 1ファイルはおおよそ3000行くらいです。 foreach(<*.html>) { open(IN_FILE, $_) || die; open(OUT, ">$_.tmp") || die; @record=<IN_FILE>; foreach $record (@record){ $record =~s/aaa/bbb/isg; } print OUT @record; close( IN_FILE); close( OUT); rename("$_.tmp", $_) ; } 当たり前かもわかりませんが、メモリー不足になり処理が中断します。 ディレクトリーの中のファイル数を600程度に少なくすると処理が完了します。 そこで質問なのですが、ディレクトリーの中のファィルを一度に全部読み込まず、1ファイルずつ順次読み込んでいくことはできないでしょうか。 最初の1行目のforeachをwhileに変えたりしたのですがうまくいきません。 対応策あればご教示ください。

    • ベストアンサー
    • Perl
  • Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ)

    Bシェルで、1文字づつ読み込む方法を教えてください。(バイナリ) 以前、下記の質問をして、回答を頂きました。 この中の入力ファイル『test.txt』がバイナリ形式だった場合は、 どのようにしたら良いでしょうか。 ### 質問 ############################################ 次のように文字が並んでいて、 A B C D E F G H I J K L M N O P それぞれの番地と共に、上記の文字を出力する場合、 どのようにしたら宜しいでしょうか。 入力ファイル:test.txt A B C D E F G H I J K L M N O P ↓ 1 2 3 4 1 A B C D 2 E F G H 3 I J K L 4 M N O P ↓ 出力ファイル A 1 1 B 2 1 C 3 1 D 4 1 E 1 2 F 2 2 G 3 2 H 4 2 I 1 3 J 2 3 K 3 3 L 4 3 M 1 4 N 2 4 O 3 4 P 4 4 ### 回答 ############################################ yy=1 while read line; do xx=1 set -f $line while [ $# -gt 0 ]; do echo $1 $xx $yy shift xx=`expr $xx + 1` done yy=`expr $yy + 1` done < test.txt ##################################################### どうぞ宜しくお願い致します。

  • シェルスクリプト while read lineにつきまして

    シェルスクリプトについて、各行の値を使って、更新したいと考えています。 引数を2つ持たせて、2つともファイルです。 ファイル名1には、 test1 test2 test3 のディレクトリを記載し、 ファイル名2には、 test4.txt test5.txt test6.txt のテキストを記載します。 例) 引数1 ファイル名1 引数2 ファイル名2 while read lineをどのように使ったら良いかわからないのですが、 ファイル名1を1行ずつ読み込んで、 読み込んだディレクトリをファイル名2に書かれているテキストを更新します。 具体的にやりたいと思っている内容ですが、 ・cd ファイル名1の1行目ディレクトリ ・svn up ファイル名2のテキスト ここをファイル名2に書かれている行分ループして 上記svn upコマンドを実行します。 ・ファイル名2に書かれている行分ループ完了後、 ファイル名1の2行目にかかれているディレクトリを読み込んで、 cd ファイル名1の2行目ディレクトリ ・svn up ファイル名2のテキスト ここをファイル名2に書かれている行分ループ。 という形のシェルスクリプトを作成したいと思っています。 上手く説明できないのですが、このようなことが出来るのかお教えいただけますでしょうか。 出来るのであれば、どのようにすればできるのかご教授いただけると幸いです。 宜しくお願い致します。

  • UNIXのシェルについて教えてください。

    UNIXシェル初心者です困っていますので教えてください。 (例) /tmp/test.txtのファイルがあるといたします。 このファイルの中身は、下記のようになっております。 01 一番 一郎 02 二番 次郎 04 三番 太郎 05 四番 吾郎      ・      ・ この中身をUNIXシェルを利用して/tmp/test1.csvに書き出し 内容を下記ように変更したいです。 01 一番 一郎 背番号 01 である。 02 二番 次郎 背番号 02 である。 04 三番 太郎 背番号 04 である。 05 四番 吾郎 背番号 05 である。      ・      ・ 実際に実施した/tmp/test.txtファイルは何百行もあり手動で作成するのは 手間です。 よろしくお願いいたします。