shell 如何获得md5输出,但制表符分隔?

gpfsuwkq  于 2023-01-21  发布在  Shell
关注(0)|答案(3)|浏览(154)

我可以使用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,这些空格不应转换为制表符。

vwkv1x7d

vwkv1x7d1#

sed是另一个选项:

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

这将用制表符替换每行的第一个空格。
(Note您要将输出重定向到的文件不应位于find正在搜索的目录树中)

np8igboo

np8igboo2#

尝试内置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
xxe27gdn

xxe27gdn3#

看起来你只是在散列和文件名之间留下了你不想要的空格。快速通过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

相关问题