Linux管道查找和md5sum不发送输出

时间:2017-05-31 01:09:42

标签: linux pipe md5sum

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

这是我到目前为止所得到的:

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

问题是,此时我还没有看到更多输出。如何将输出发送到md5sum并继续发送结果?

3 个答案:

答案 0 :(得分:3)

md5sum读取从stdin到文件末尾(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循环将运行循环体(dodone之间的命令),$ a将是当前行。读取的-r选项是不转换反斜杠; echo命令的-n选项不会添加换行符(如果需要换行符,请删除echo的-n选项)。

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

答案 1 :(得分:1)

您可以使用从find调用的简短“帮助”脚本来执行您尝试执行的操作。例如,您可以创建一个简短的脚本来查找作为参数传递的每个文件的basename,删除'.jpg'扩展名,然后提供没有扩展名的剩余名称作为{{1的输入在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 内的-execdir版本调用脚本,例如

find

注意:使用$ find /home/david/img/wp/ -type f -name "*.jpg" -execdir \ /full/path/to/namemd5.sh '{}' \; 上面的助手脚本)

答案 2 :(得分:0)

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

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