linux shell md5sum 指令的诡异问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell md5sum 指令的诡异问题相关的知识,希望对你有一定的参考价值。
我是一名shell的初学者,正在看linux shell 脚本攻略 作者在73页提供了一种利用md5sum消除内容相同文件的方法 我按照它上面的写了 却得不到正确的结果 调试了2个小时把问题定位在md5sum上 我的程序是这样的: #!/bin/bash ls -lS | awk ' BEGINgetline;getline; name1=$9;size1=$5; name2=$9 size2=$5 if (size1==size2) print name1,name2 print "md5sum "name1 "md5sum "name1 | getline; sum1=$1; print $0 "md5sum "name2 | getline; sum2=$1; print $0 if (sum1==sum2) print name1; print name2; name1=name2 size1=size2 ' > files #cat files | xargs -I md5sum | sort | uniq -w 32 | awk ' print "^"$2"$"' | sort -u > sample 前面得到内容相同的文件名字,后面是依照这个文件进行处理。便于调试问题我把后面的注释掉了,中间的一些输出是我的调试信息。 得到的file文件的内容是: text text1 md5sum text 7cf0564cb453a9186431ee9553f7f935 text 7cf0564cb453a9186431ee9553f7f935 text1 text text1 text1 text2 md5sum text1 -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 14 4月 12 10:28 text2 7cf0564cb453a9186431ee9553f7f935 text2 也就是说他执行md5sum text1的时候得到的居然是 -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 14 4月 12 10:28 text2 这真的令我百思不得其解 我的linux 是 fedora 16 为了帮助高手们解决问题 附上我的ls -lS 信息: 总用量 48 -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 454 4月 13 00:19 remove_duplicates.sh~ -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 452 4月 13 00:19 remove_duplicates.sh -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 243 4月 13 00:19 files -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 109 4月 13 00:06 temp.sh~ -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 99 4月 13 00:07 temp.sh -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 36 4月 12 10:17 a -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 27 4月 12 10:18 b -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 14 4月 12 10:27 text -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 14 4月 12 10:28 text1 -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 14 4月 12 10:28 text2 -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 11 4月 12 10:28 other -rw-rw-r--. 1 bistu_sayyes bistu_sayyes 7 4月 12 19:09 sample 跪求大侠指教……分不是问题……
参考技术A 初看你的代码,貌似没什么问题,琢磨了半天才发现原来和相同文件的个数有关。当你的相同文件数目大于等于3时,就会出这个问题。只有两个文件相同时,则不会出。
比如你的
text,
text1,
text2
是相同的,第一次进入时
比较和处理text,
text1
没有问题。
第二次进入时,此时要比较
text1
和
text2,相当于要执行
"md5sum
text1"
|
getline;
sum1=$1;
$0
"md5sum
text2"
|
getline;
sum2=$1;
$0
但是由于
"md5sum
text1"
|
getline
这条管道语句已经在上次比较
text
和
text1
时执行过了,awk在第二次执行的时候就不会再创建管道执行同样的md5sum命令让getline读取,而是尝试从之前打开的管道中让getline读取内容,显然,此时已经没有内容可读了,因此此时getline
会失败
(如果你用
if
语句判断这条命令的返回值,会发现返回值不等于1
(应该是0,表示
end
of
file)。所以这条语句并不会更新
$0
$1
这些变量,所以后面你
$0
实际上打印的是
ls
-lS
得到的输入。
解决方法很简单,在每次
"md5sum
"name
|
getline
之后,用close命令,比如
"md5sum
"name1
|
getline;
sum1=$1;
close("md5sum
"name1)
$0
"md5sum
"name2
|
getline;
sum2=$1;
close("md5sum
"name2)
$0
这样就在每次getline之后,都关闭管道,从而确保下次总能重新创建管道及执行md5sum命令。
诡异的shell函数
set -eset -o pipefail
a(){
1
2
3
echo ‘ok‘
}
b(){
if a;then
echo ‘ok‘
else
echo ‘okk‘
fi
a || echo ‘ok‘
a
}
b
b函数3种调用方式,a函数执行的结果不同
以上是关于linux shell md5sum 指令的诡异问题的主要内容,如果未能解决你的问题,请参考以下文章
unix 编一个shell,使用md5sum将路径中的文件分类
linux的shell,怎么把一个文件的md5值赋值到一个数组里 类似 a[1]=md5sum a.txt ,但是这样没法赋值,求解