【问题标题】:How to get md5 output but tab separated?如何获得 md5 输出但制表符分隔?
【发布时间】:2020-04-28 03:55:09
【问题描述】:

我可以使用md5 -r foo.txt > md5.txt 创建一个文本文件,文件的 md5 后跟一个空格,然后是该文件的本地路径.. 但是我将如何让这两个项目由 TAB 分隔角色?

作为参考和上下文,我使用的完整命令是

find . -type f -exec \
  bash -c '
    md=$(md5 -r "$0")
    siz=$(wc -c <"$0")
    echo -e "${md}\t${siz}"
  ' {} \; \
  > listing.txt

请注意,md5 输出的 filepath 项也可能包含空格,例如 ./path to file/filename,这些不应转换为制表符。

【问题讨论】:

  • md5 命令是什么?计算和 MD5 校验和的常用命令是md5sum(它没有-r 选项)。你在使用openssl md5 命令吗?我知道,如果您有一个名为 md5 的符号链接指向 /usr/bin/openssl,它将计算和 MD5 校验和,但至少在我的系统上默认没有安装符号链接。
  • 看来md5在BSD上,md5sum在linux上,我刚刚在FreeBSD上测试过。很可能OP在Mac os上。
  • @Jetchisel:是md5的openssl版本吗?如果是这样,md5 可能是指向openssl 的符号链接,md5 -help 将显示大约 26 行信息,其中大部分与 MD5 校验和无关。 (这很重要,因为 GNU coreutils md5sum 命令和 OpenSSL md5 命令的输出格式不同,这与这个问题非常相关。)
  • @Erics 由于不是每个人都会使用相同的md5 命令,因此在您的问题中显示md5 -r somefile 的确切输出会很有帮助。
  • @KeithThompson,在我的 FreeBSD 上它是一个可执行的 ELF b4bit,所以这里没有符号链接。同样在 BSD 的 -help--help-h 上是一个错误。

标签: bash shell


【解决方案1】:

sed 是另一种选择:

find directory/ -type f -exec md5 -r '{}' '+' | sed 's/ /\t/' > listing.txt

这会将每行的第一个空格替换为制表符。

(请注意,您将输出重定向到的文件不应位于 find 正在搜索的目录树中)

【讨论】:

  • My md5sum(GNU coreutils 的 8.30 版)在散列和文件名之间打印两个空格。因此我会使用sed -E 's/ +/\t/'
  • @Socowi 听起来 OP 没有使用那个程序。
  • @Jetchisel 不,文件名中的空格在这里不是问题,因为sed s/a/b/ 仅替换了a第一次 出现(注意没有g最后标记)。
  • @Jetchisel 为什么我要告诉它替换所有空格而不仅仅是第一个?
  • 阅读理解在这方面失败了......无论如何,OP也想做wc部分。
【解决方案2】:

试试内置的printf 和 P.E.参数扩展,拆分md变量。

find . -type f -exec sh -c '
  md=$(md5 -r "$0") siz=$(wc -c <"$0")
  printf "%s\t%s\t%s\n" "${md%% *}" "${md#*"${md%% *}"}" "${siz}"
' {} \; > listing.txt

输出

d41d8cd98f00b204e9800998ecf8427e        ./bar.txt              0
d41d8cd98f00b204e9800998ecf8427e        ./foo.txt              0
d41d8cd98f00b204e9800998ecf8427e        ./more.txt             0
d41d8cd98f00b204e9800998ecf8427e        ./baz.txt              0
314a1673b94e05ed5d9757b6ee33e3b1        ./qux.txt              0
  • 查看 bash 在线手册ParameExpansion

  • 本地手册页(如果有)。 PAGER='less +/^[[:space:]]*parameter\ expansion' man bash

【讨论】:

  • 什么是“P.E.”意思是? (我想我知道你的意思,但很多读者不会。)
  • 就个人而言,我会放弃“P.E.”。我想我从来没有见过这个缩写。只是称它为参数扩展更简单。
【解决方案3】:

看起来您只是在哈希和文件名之间留下了您不想要的空格。快速通过 awk 可以为您清理这些问题。默认情况下,输入 awk 分隔符是任意数量的空白。只需运行 awk 并使用新的 OFS(输出字段分隔符)打印字段即可。事实上,它使通过echo 毫无意义。

time find . -type f -exec bash -c 'md=$(md5 -r "$0"); siz=$(wc -c <"$0"); awk -vOFS="\t" "{print \$1,\$2,\$3}" <<< "${md} ${siz}" ' > listing.txt {} \;

就我个人而言,我会将该 find 命令的输出运行到一个 while 循环中。这与上面的基本相同,但更容易理解。

time find . -type f | \
while read -r file; do
    md=$(md5 -r "$file")
    siz=$(wc -c < "$file")
    awk -vOFS="\t" '{print $1,$2,$3}' <<< "${md} ${siz}"
done > listing.txt

【讨论】:

  • 如果文件路径项包含空格,例如./path to item/filename,awk 是否正确?
猜你喜欢
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 2016-04-02
  • 2021-07-25
  • 2015-07-26
相关资源
最近更新 更多