0

我正在尝试将多个 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 外壳)

4

2 回答 2

1

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

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

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

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

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

(如果您有旧版本,find则可能必须-exec md5sum {} \;改用。)

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

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

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

于 2014-09-04T06:32:24.557 回答
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
于 2014-09-04T07:29:56.537 回答