2011-07-06 9 views
10

内の文字列の最初の文字を削除し、私は私のlsダンプ、directory_listing_fileに1行に1つの文字列(pathfile)のmd5sum値を計算する必要があります。はバッシュ

./r/g4/f1.JPG 
./r/g4/f2.JPG 
./r/g4/f3.JPG 
./r/g4/f4.JPG 

しかし、それのmd5sumは、初期ドットずに計算する必要があります。

while read line 
do 
    echo $line | exec 'md5sum' 
done 

./g.sh < directory_listnitg.txt 

がどのように私は、各ラインからの最初のドットを削除するには: 私は、簡単なスクリプトを書きましたか?あなたがパイプでき

+2

[クロスポスト](http://superuser.com/questions/306947/how-to-remove-first-dot)は本当に必要ありません。 –

答えて

1

パス区切りにフィールドセパレータを設定し、$nameに最初のスラッシュの前のもの以外のすべてをお読みください。

while IFS=/ read junk name 
do 
    echo $name 
done < directory_listing.txt 
11

それそれがドットで始まらない入力を処理することができるという利点を有しており、sedを使用して、あなたに

while read line 
do 
echo $line | cut -c2- | md5sum 
done 

./g.sh < directory_listnitg.txt 
3

異なるアプローチを提供します

cut -c2- 

へ。また、echoの改行を出力に追加すると、md5sumが偽の結果を報告するという問題に遭遇することはありません。

#!/bin/bash 

while read line 
do 
    echo -n $line | sed 's/^.//' | md5sum 
done < input 

は、これらの比較:

$ echo "a" | md5sum 
60b725f10c9c85c70d97880dfe8191b3 - 

$ echo -n "a" | md5sum 
0cc175b9c0f1b6a831c399e269772661 - 
+0

非常にエレガントな、ありがとう! – Daniel

2

あなたは全体を行うことができますこのようなもの:

% sh -c `sed '[email protected]^.\(.*\)@md5sum \[email protected]' <./dirlist.txt` 

本当に、これはもっと効率的にすることができると思っていますが、私はあなたのリストを生成しているのか分かりません。 pipeからそれを実行したり、そのコマンドをheredocで実行して出力を維持することができれば、このジョブ全体をストリームすることができます。

EDIT:

OK、あなたはそれからだと言う "LSダンプ。"さて、ここに少し柔軟なものがあります:

これは、合計で1つのサブシェルだけを呼び出すと思います。それはかなり良いはずですが、私の意見では、find ... -exec md5sum {} ... +はおそらく、より安全で、速く、必要なものすべてです。

EDIT2:

OK、今私は実際に質問にお答えします。あなただけのようなパラメータ展開に目を向ける必要は任意のPOSIX互換シェルで文字列の最初の文字を削除するには、次のmyStringの文字番号1(文字0から開始し

${string#?} 

-Mike

+0

偉大なコマンドは、私の場合のための解決策を見つけました。私はPOSIXシェルを使って文字列の最初の3文字を削除しなければならず、 '$ {string#???}'が私のために働いていました。ありがとう! – Michael

6
myString="${myString:1}" 

ています一番左の文字)は文字列の残りの部分を返します。文字列中のスペースを許しています。そのアスペクトに関する詳細は$ IFSを見てください。