利用 sort 进行 md5 校验

在正式使用之前,先来温习下 sort 的相关知识。
假设需要操作的文件如下:

$ cat sort.txt
ea038dab392acba4e64dd6cc3512cb69  /bin/readlink
319ae7896edf8aeebcbc94976402595d  /bin/ypdomainname
041fb5eb02d09b2ce46c5170556b06d3  /bin/mknod
9a83449f2577f6a7c82f941168175a91  /bin/lesskey
9446e2582df35daddf333dc75a9ac7bf  /bin/plymouth
2b1c9d8fa907caa4c7bf3c6e16c6f88c  /bin/ping6
cb9cc755697f811ca67cdf83af014e5d  /bin/openvt
8b6a1ef15d769b638319fb06c39ff6a1  /bin/su
f4def71857b9c3792a8b140df20af57e  /bin/ps
848e9828b6fddc4d822b24ad7806e2fb  /bin/pwd
6e0dada83903335efb2104c56170eaf6  /bin/chmod
6a7e0fe4d9a801b78ca12385cf0345de  /bin/more
fee856172ec8c607058b76f5491d13a2  /bin/sed

下面是一些常见的手法,简单的说明一下。

跟据 ASCII 进行比较,升序输出:

$ sort sort.txt

同上,但是略过重复行:

$ sort -u sort.txt

降序输出:

$ sort -r sort.txt

以数值,而不是 ASCII 为标准进行比较:

$ sort -n sort.txt

下面是今天要详述的,正如上面看到的 sort.txt 文件,默认比较都是先比较第一列,如果我们想以第二列为基准进行比较,这时候就要这样做了:

$ sort -k 2 -t " " sort.txt
6e0dada83903335efb2104c56170eaf6  /bin/chmod
9a83449f2577f6a7c82f941168175a91  /bin/lesskey
041fb5eb02d09b2ce46c5170556b06d3  /bin/mknod
6a7e0fe4d9a801b78ca12385cf0345de  /bin/more
cb9cc755697f811ca67cdf83af014e5d  /bin/openvt
2b1c9d8fa907caa4c7bf3c6e16c6f88c  /bin/ping6
9446e2582df35daddf333dc75a9ac7bf  /bin/plymouth
f4def71857b9c3792a8b140df20af57e  /bin/ps
848e9828b6fddc4d822b24ad7806e2fb  /bin/pwd
ea038dab392acba4e64dd6cc3512cb69  /bin/readlink
fee856172ec8c607058b76f5491d13a2  /bin/sed
8b6a1ef15d769b638319fb06c39ff6a1  /bin/su
319ae7896edf8aeebcbc94976402595d  /bin/ypdomainname

通过 -k 和 -t 参数,可以选择性的进行排序。

通过这个选项,我们就可以使用 md5 来对文件做的校验和来进行比较了,下面这个脚本有一个 list 文件,该文件放置的是需要做 md5 的目录,一行一个目录。

$ cat md5.sh
#!/bin/sh

# this script will md5 the dir and the
# files in this dir
# jaseywang

file=$1

usage(){
        echo "Usage: "
        echo "$0 your-file"
        echo "Example:"
        echo "$ cat list"
        echo "/bin"
        echo "/sbin"
        echo "./md5.sh list"
        
        exit 1
}

[ $# -eq 0 ] && usage

while read line
do
dir_md5=$(tar c $line | md5sum | cut -f 1 -d ' ')

echo "${dir_md5}  ${line}/" >> md5
find $line -type f -exec md5sum {} \; | sort -k 2 -t " " >> md5
echo "" >> md5
done < $file

参考:
http://stackoverflow.com/questions/1657232/how-can-i-calculate-an-md5-checksum-of-a-directory