Bash将文件不是路径的md5sum作为字符串

时间:2014-09-04 06:10:32

标签: bash md5sum

我试图在文本文件中保存多个java文件的md5sum,但正如我所看到的,它创建了路径的md5sum而不是文件本身。

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        echo -n $line | md5sum.exe | cut -d' ' -f1 | tr -d '\n' >> $FileName
        echo -n "-" >> $FileName
        echo -n $line | cut -d' ' -f2 >> $FileName
    fi
done

我也试图消除除最后一个之外的任何新行。 当我将md5sum的路径更改为不存在的文件时,它仍然生成了md5sum。 (我正在使用MINGW Shell)

2 个答案:

答案 0 :(得分:1)

实际上,没有文件名的md5sum从标准输入中读取其数据(而不是其参数),并为此计算校验和。

切向,echo filename | xargs md5sum是一种解决方法,如果你真的需要从stdin读取参数。

但是在这里,你没有理由这样做。

find "$FilesDirectory" -type f -iregex '.*\.java' \
    -exec md5sum + |
sed 's%  *.*/%-%' >"$FileName"

-type f替换所有找到的文件中的if [ -f ...-exec ... +运行md5sum。然后我们简单地对输出进行后处理以在校验和之后放置破折号而不是空格。正则表达式匹配空格,然后匹配最后一个斜杠的任何字符,并将其全部替换。因此它也删除了路径名。

(如果您使用旧版find,则可能需要使用-exec md5sum {} \;。)

如果所有文件都在当前目录中,并且没有与通配符匹配的目录(在这种情况下-type f上面也是多余的)并且没有太多可以使通配符扩展对于太长的阉割("参数列表太长")你可以简单地做

md5sum *.[jJ][aA][vV][aA] | ...

如果您需要使用find并且您有子目录但不希望它遍历它们,请添加-maxdepth 1

答案 1 :(得分:1)

如果您只是担心将md5sum和文件名以md5sum-filename格式输出到文件,那么您只需使用模式扩展子字符串提取读取文件的md5sum(它可能存在的地方)并删除路径信息,只留下要输出的名称:

find $FilesDirectory -iregex '.*\.java' | while read line; do

if [ -f "$line" ] 
    then
        md5str="$(md5sum "$line")"
        sum=${md5str%% *}
        sumfn=${md5str##* }
        sumfn=${sumfn##*/}

        echo "$sum-$sumfn" >> $FileName
    fi
done