2017-05-31 26 views
0

试图循环每个文件,做一些切割,提取MD5的前4个字符。Linux管道寻找和md5sum不发送输出

这是我走到这一步:

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

问题是,我没有看到任何更多的输出,在这一点上。我如何发送输出到md5sum并继续发送结果?

+1

你们是不是要计算文件的MD5SUMS?这不是在这里发生的。 –

+0

不,我想计算从管道输出的文本的md5 – user2914191

+0

'find'命令是否完成? –

回答

2

的md5sum读一切从标准输入,直到文件(EOF)的结束,并输出完整的文件的MD5校验。你应该while read var回路分开输入到行,每行运行的md5sum,例如:

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选项不会添加换行符(如果您想换行,请删除回显的-n选项)。

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

+0

在https://stackoverflow.com/a/5890196中使用了相同的循环,类似于https://stackoverflow.com/a/31955350 – osgx

+0

这是我正在寻找的,但无法弄清楚 – user2914191

0

如何找到那么所有.jpg文件,然后执行的md5sum削减前4个caracters:

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

我需要md5的文件名(没有扩展名),而不是文件的整个路径 – user2914191

+0

尽管这段代码可能回答这个问题,但提供了关于如何和/或为什么它解决了这个问题的附加上下文提高答案的长期价值。 – Badacadabra

1

您可以使用您从find拨打的简短“帮手”脚本来做你正在尝试做的事情。例如,您可以创建一个简短脚本来查找作为参数传递的每个文件的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的上面你的助手脚本)