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
并继续发送结果?
如何找到所有.jpg文件然后执行md5sum然后剪切前4个字符:
find . -name '*.jpg' -exec md5sum {} \; | cut -b 1-4
md5sum 读取从标准输入到文件结尾 (eof) 的所有内容,并输出完整文件的 md5 和。您应该将输入分成几行,每行 运行 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
builtin bash command 将从输入中读取一行到 shell 变量 $a
; while
循环将 运行 循环体(do
和 done
之间的命令)用于读取的每个 return,并且 $a 将是当前行。 read的-r选项是不转换反斜杠; echo 命令的 -n 选项不会添加换行符(如果你想要换行符,请删除 echo 的 -n 选项)。
这对于数千个甚至更多的文件来说会很慢,因为循环内的每个文件都有几个 forks/execs。使用 perl 或 python 或 nodejs 或任何其他具有内置 md5 哈希计算(或某些库)的脚本语言编写脚本会更快。
您可以使用从 find
调用的简短“helper”脚本来完成您想做的事情。例如,您可以创建一个简短的脚本来查找作为参数传递的每个文件的 basename
,删除 '.jpg'
扩展名,然后提供剩余的名称 w/o 扩展名作为 md5sum
在 stdin
上获取名称本身的 md5sum
。随意调用脚本,比如 namemd5.sh
。示例:
#!/bin/bash
[ -z "" ] && exit 1 ## validate single argument
fname=$(basename "") ## 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
例子Use/Output
$ 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
你的帮助脚本)
尝试循环每个文件,进行一些切割,提取 MD5 的前 4 个字符。
这是我目前得到的结果:
find . -name *.jpg | cut -f4 -d/ | cut -f1 -d. | md5sum | head -c 4
问题是,此时我没有看到更多输出。如何将输出发送到 md5sum
并继续发送结果?
如何找到所有.jpg文件然后执行md5sum然后剪切前4个字符:
find . -name '*.jpg' -exec md5sum {} \; | cut -b 1-4
md5sum 读取从标准输入到文件结尾 (eof) 的所有内容,并输出完整文件的 md5 和。您应该将输入分成几行,每行 运行 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
builtin bash command 将从输入中读取一行到 shell 变量 $a
; while
循环将 运行 循环体(do
和 done
之间的命令)用于读取的每个 return,并且 $a 将是当前行。 read的-r选项是不转换反斜杠; echo 命令的 -n 选项不会添加换行符(如果你想要换行符,请删除 echo 的 -n 选项)。
这对于数千个甚至更多的文件来说会很慢,因为循环内的每个文件都有几个 forks/execs。使用 perl 或 python 或 nodejs 或任何其他具有内置 md5 哈希计算(或某些库)的脚本语言编写脚本会更快。
您可以使用从 find
调用的简短“helper”脚本来完成您想做的事情。例如,您可以创建一个简短的脚本来查找作为参数传递的每个文件的 basename
,删除 '.jpg'
扩展名,然后提供剩余的名称 w/o 扩展名作为 md5sum
在 stdin
上获取名称本身的 md5sum
。随意调用脚本,比如 namemd5.sh
。示例:
#!/bin/bash
[ -z "" ] && exit 1 ## validate single argument
fname=$(basename "") ## 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
例子Use/Output
$ 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
你的帮助脚本)