2016-01-05 178 views
0

我必須編寫一個命令,我們必須找到文件,計算一個md5代碼,然後將其放入文本文件中。找到這些文件並不難,只是將stdin作爲參數傳遞給sed

find -type f 

現在我有一個文件列表,併爲每個文件我必須要找到MD5碼。我知道代碼生成MD5碼

openssl dgst -md5 <file> 

但我怎麼使用管道(無腳本)有類似this`

filename md5code 

我已經嘗試過

while read line do... done 

但那沒用。我認爲我必須使用sed,但我現在不是真的如何。我最近嘗試(我認爲)是這樣的:

find dir -type f | sed "s/^\(.*\)$/\1 $(openssl dgst -md5 \1)/" >> file.txt 

但它不承認\ 1 ...

我在找到這樣的-exec選項試了一下:

md5$ find dir -type f -exec sed "s/^\(.*\)$/\1 $(openssl dgst -md5 {})/" \; 

但它不承認{}

回答

1

你的命令替換不會單引號內的工作,而且,我會建議使用-exec開關而不是管道。你也可以使用-print(或-printf,如果你的版本的find支持的話),儘管文件名被包含在我係統的openssl命令的輸出中,所以也許你不需要它。試試這個:

find . -type f -printf '%f ' -exec openssl dgst -md5 {} \; 
+0

謝謝!這工作,沒有想到-printf。 – micro

0

可以使用xargs命令來處理由find命令返回的文件列表。

find dir -type f | xargs md5sum >> file.txt 

大多數Unix類操作系統應該安裝md5sum實用所以我代替openssl dgst -md這一點。 xargs命令將文件列表作爲輸入,然後使用這些命令作爲md5sum命令的參數來構建命令。

如果您有空格或其他特殊字符的文件名,你需要使用:

find dir -type f -print0 | xargs -0 md5sum >> file.txt 

-print0選項使用NULL字符分隔由find命令和-0, --null返回的文件列表xargs選項告訴它使用NULL而不是空格來分隔輸入項目。

注意:這將與GNU版本的這些工具一起使用。我不知道其他版本,因爲它不被POSIX specification for find採用。