【问题标题】:Linux piping find and md5sum not sending outputLinux管道查找和md5sum不发送输出
【发布时间】:2017-06-02 10:04:27
【问题描述】:

尝试循环每个文件,进行一些剪切,提取 MD5 的前 4 个字符。

这是我目前得到的:

find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. | md5sum | head -c 4

问题是,此时我看不到任何输出。如何将输出发送到md5sum 并继续发送结果?

【问题讨论】:

  • 您是否尝试计算文件的 md5sums?这不会发生在这里。
  • 不,我想计算管道输出文本的 md5
  • find 命令完成了吗?
  • 您编写的命令计算整个 find/cut 结果的单个 MD5 哈希。
  • 我一次只需要一个文件名的 md5,而不是整个流。看起来我不得不蟒蛇这个

标签: linux pipe md5sum


【解决方案1】:

md5sum 读取从标准输入到文件结尾 (eof) 的所有内容,并输出完整文件的 md5 总和。您应该将输入分成几行并每行运行 md5sum,例如使用 while read var 循环:

find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. | 
  while read -r a; 
   do   echo -n $a| md5sum | head -c 4; 
  done

read builtin bash command 将从输入中读取一行到 shell 变量$a; while 循环将为读取的每个返回运行循环体(do 和 done 之间的命令),并且 $a 将是当前行。 -r 选项 read 是不转换反斜杠; echo 命令的 -n 选项不会添加换行符(如果需要换行符,请删除 echo 的 -n 选项)。

这对于数千个文件或更多文件来说会很慢,因为循环内的每个文件都有几个 fork/execs。更快的是使用 perl 或 python 或 nodejs 或任何其他具有内置 md5 哈希计算(或使用某些库)的脚本语言编写脚本。

【讨论】:

【解决方案2】:

您可以使用从find 调用的简短“helper”脚本来执行您尝试执行的操作。例如,您可以创建一个简短的脚本来查找作为参数传递的每个文件的basename,删除'.jpg' 扩展名,然后将剩余的不带扩展名的名称作为md5sum 的输入提供stdin获取名称本身的md5sum。给脚本起任何你喜欢的名字,比如namemd5.sh。示例:

#!/bin/bash

[ -z "$1" ] && exit 1           ## validate single argument

fname=$(basename "$1")          ## get the filename alone
fname="${fname%.jpg}"           ## remove .jpg extension

fnsum=$(md5sum - <<<"$fname")   ## get md5sum of name w/o .jpg
fnsum=${fnsum%% *}              ## remove trailing ' -'

echo "$fnsum - $fname"          ## output md5sum - name
                                ## (remove ' - $fname' for md5sum alone)

(注意:该名称是作为输出的一部分提供的,用于示例目的,如果您想要单独的 md5sum,请删除,如上面的评论所示)

示例文件

$ find /home/david/img/wp/ -type f -name "*.jpg"
/home/david/img/wp/hacker_manifesto_1200x900.jpg
/home/david/img/wp/hacker_manifesto_by_otalicus.jpg
/home/david/img/wp/reflections-triple-1920x1200.jpg
/home/david/img/wp/hacker_wallpaper_1600x900.jpg
/home/david/img/wp/Zen.jpg
/home/david/img/wp/hacker_wallpaper_by_vanilla23-dot254.jpg
/home/david/img/wp/hacker_manifesto_1600x900.jpg

使用/输出示例

$ find /home/david/img/wp/ -type f -name "*.jpg" -exec ./namemd5.sh '{}' \;
0f7d2aac158eb9f7842215e14ff6573c - hacker_manifesto_1200x900
604bc695a0bb70b8db0352267caf226f - hacker_manifesto_by_otalicus
5decea0e306f185bf988ac9934ec0e2c - reflections-triple-1920x1200
82bd8e1ad3df588eb0e0848c5f764812 - hacker_wallpaper_1600x900
0f4daba431a22c03f28977f087e4c695 - Zen
0c55cd3ebd2a847e10c20d86e80e6ceb - hacker_wallpaper_by_vanilla23-dot254
e5c1da0c2db3827d2bf81c306633cc56 - hacker_manifesto_1600x900

您也可以在find 中调用带有-execdir 版本的脚本,例如

$ find /home/david/img/wp/ -type f -name "*.jpg" -execdir \
/full/path/to/namemd5.sh '{}' \;

(注意:在上面的帮助脚本中使用/full/path)

【讨论】:

    【解决方案3】:

    如何找到所有 .jpg 文件然后执行 md5sum 然后剪切前 4 个字符:

    find . -name '*.jpg'  -exec md5sum {} \; | cut -b 1-4
    

    【讨论】:

    • 我需要文件名的 md5(无扩展名),而不是文件的整个路径
    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    猜你喜欢
    • 2011-02-14
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多