繁体   English   中英

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

[英]Linux piping find and md5sum not sending output

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

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

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

问题是,目前我看不到更多输出。 如何将输出发送到md5sum并继续发送结果?

md5sum读取从stdin到文件末尾(eof)的所有内容,并输出完整文件的md5 sum。 您应该将输入分成几行,并每行运行md5sum,例如,使用while read var loop:

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

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

对于成千上万个文件和更多文件,这将很慢,因为循环内每个文件都有多个fork / exec。 使用perl或python或nodejs的脚本或使用内置md5哈希计算(或使用某些库)的任何其他脚本语言,将更快。

您可以使用从find调用的简短“ 帮助程序 ”脚本来完成尝试做的事情。 例如,您可以创建一个简短的脚本来查找作为参数传递的每个文件的basename ,删除'.jpg'扩展名,然后提供剩余的不带扩展名的名称作为stdinmd5sumstdin以获取的md5sum 。名称本身。 namemd5.sh调用脚本,例如说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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM