【问题标题】:Bash /shell/ script md5 hash tree output to .csv file [closed]Bash /shell/ 脚本 md5 哈希树输出到 .csv 文件 [关闭]
【发布时间】:2011-11-21 12:01:28
【问题描述】:

我需要 bash /shell/ 脚本来 md5sum 将所有当前目录树文件​​散列到一个 .csv 文件,如下所示:

"index.php","add95c73ccafa79b4936cf7236a074f4"
"logs/index.html","1c7b413c3fa39d0fed40556d2658ac73"

非常感谢;)

【问题讨论】:

  • 你真的应该尝试一些东西,然后带着问题回来,而不是让别人为你写代码。
  • Srrry Noufal,但这是我的大问题 ;)

标签: bash shell scripting md5 md5sum


【解决方案1】:

您可以尝试以下命令,但只有在以下情况下才会起作用:

  • 您的文件名中没有 " 字符
  • 文件名中没有换行符

如果没问题,那么这应该适合你:

find . -type f -print0 | xargs -0 md5sum | \
    sed -r 's/^([0-9a-f]{32})  (.*)/"\2","\1"/'

否则,您需要进行正确的 CSV 引用,在这种情况下,我建议使用 csv 模块编写一个简短的 Python 脚本来执行此操作。例如:

#!/usr/bin/env python

import os, csv, sys, subprocess, hashlib

writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL)

for directory, subdirectories, filenames in os.walk('.'):
    for filename in filenames:
        h = hashlib.md5()
        full_filename = os.path.join(directory, filename)
        with open(full_filename, 'rb') as f:
            while True:
                data = f.read(8096)
                if len(data) == 0:
                    break
                h.update(data)
        writer.writerow([h.hexdigest(), full_filename])

【讨论】:

  • 谢谢你,马克,像魅力一样工作:)
【解决方案2】:

试试:

find . -type f -print0 | xargs -0 md5sum | perl -pe 's/^(.*?)\s+(.*)$/"$2","$1"/'
> md5.csv

【讨论】:

  • 是的,像魅力一样工作,但输出是这样的:
  • dd5d02cc750d2855cf6f6c5bf5bea587 ./language/index.html
  • @EvanPalMcDan:请尝试我修改后的命令。
  • 是的,BiNGo,谢谢 Codaddict :)
  • 如果你使用find . -type -f -exec md5sum {} \;,就少一个管道/cmd
【解决方案3】:
md5sum * | awk '{ print "\"" $2 "\",\"" $1 "\"" }'

【讨论】:

  • 如果文件名有空格,这将失败。
  • 谢谢!像这样使用正确的输出,但我需要它递归处理所有目录,而不会出现此错误:md5sum: templ: is directory "index.php","31fa74772d49e0c661ce8ee28f52b590"
【解决方案4】:

您可以如下所示进行。下面,我正在使用计算 CRC 校验和的 cksum 实用程序。您可以使用生成 MD5 校验和的实用程序。您可以将输出重定向到 .csv 文件。

#!/bin/ksh

for file in $(find $1 -type f)
do
    filename=$(basename $file)
    checksum=$(cksum $file | cut -d " " -f 1)
    echo \"${filename}\",\"${checksum}\"
done

【讨论】:

  • 工作完美,但没有文件路径:(
  • 如果您还需要输出中的完整文件路径,请检查以下 #!/bin/ksh for file in $(find $1 -type f) do checksum=$(cksum $file | cut -d " " -f 1) echo \"${file}\",\"${checksum}\" 完成
【解决方案5】:

这应该可以工作

perl -pne 's/^"(.*)","([0-9a-f]+)"$/$2 *$1/io' < input | md5sum -c

【讨论】:

  • @EvanPalMcDan:再来一次?你认为我的解决方案是什么?
  • 我在树上没有 .exe 文件;) md5sum.exe: 找不到命令
  • arg...cygwin 人工制品。当然只是删除 exe
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 2019-12-20
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
相关资源
最近更新 更多