2014-09-04 28 views
0

我试图将多个java文件的md5sum保存在文本文件中,但正如我所见,它创建了一个md5sum的路径,而不是文件本身。Bash得到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)

+0

'md5sum.exe“$ line”|剪切...' – 2014-09-04 06:17:09

+0

'在* .java中的行' – 2014-09-04 06:19:39

+0

为什么你有'.exe'后缀?你在Cygwin吗? – tripleee 2014-09-04 06:24:23

回答

1

如果你只是担心格式md5sum-filename md5sum也和文件名,输出到一个文件,那么你可以简单地使用模式扩张子提取读取文件的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 
+0

好吧,这似乎相当完美。我会测试一段时间并回来给你,但到目前为止,我似乎很高兴与这个答案谢谢。 – 2014-09-04 07:38:00

+0

再次感谢你我跑了一个很大的测试,一切都很完美。做得好! – 2014-09-04 07:56:18

1

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

切线方向,echo filename | xargs md5sum是一种解决方法,如果您确实需要从标准输入读取参数。

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

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

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

(如果你有一个旧版本的find您可能需要使用-exec md5sum {} \;代替。)

如果所有的文件都在当前目录下,并有相匹配的通配符(这是任何目录在这种情况下-type f是上面多余的,太),并没有那么多,容易引起通配符扩大到steing是太长(“参数列表太长”),你可以简单地做

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

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

+0

嗯,我试过这个,但它说: “找到:缺少参数到”-exec“ 我在网上搜索exec后,我只找到方法将stdin重定向到文件名作为参数。但在这种情况下,我看不出如何使用它。 – 2014-09-04 07:35:10

+0

这表明'find'不支持'-exec ... +'。请改用'-exec ... {} \;'变体。 – tripleee 2014-09-04 10:13:06

相关问题