Linux下计算文件的MD5值推荐

脚本用途

服务器在安装完操作系统后,计算PATH变量里面所有的二进制文件的MD5、计算单个文件MD5值、计算某个目录(包括子目录)下所有的文件的MD5值记录到文件,等日后再生成一份,然后2份文件进行对比,即可知道这些文件是否又被改动过.

脚本用法(6种用法)

脚本名-p [ 输出的文件名] 该功能是计算PATH变量里面所有文件的MD5值脚本名 -p -f MD5文件 [ 输出的文件名] 该功能是计算PATH变量里面所有文件的MD5值并跟上一次生成的MD5文件相对比脚本名文件1文件2文件3... [ 输出的文件名] 该功能是计算指定文件的MD5值脚本名目录1目录2目录3... [ 输出的文件名] 该功能是计算指定目录下所有文件的MD5值脚本名-cMD5文件1MD5文件2[ 输出的文件名] 该功能是比较同一个目录下所有文件生成的2次MD5文件中有哪些MD5值不一致脚本名目录-fMD5文件[ 输出的文件名] 该功能是跟上面的功能类似,只是这个不生成文件直接比对

注意事项

不能对/proc目录进行计算不能对/(根)进行计算,因为/里面包含/proc不能对挂载在Linux上Windows的共享目录进行计算

脚本内容

【第二版】

#!/usr/bin/perluseDigest::MD5;useFile::Find;#2012-12-1615:24Leochanyipiaomiao@163.com#Blog:http://linux5588.blog.51cto.com#用法提示$usage= Usage:scriptname-p|Directory1...|File1...|-cMD5File1MD5File2|Directory-fMD5File[ OUTFILE] ;$usagecompare= Usage:scriptname-cMD5File1MD5File2[ OUTFILE] ;$usagepath= Usage:scriptname-p|-p-fMD5File[ OUTFILE] ;#判断命令行参数是否为空,为空则直接计算PATH路径里面所有的二进制文件的MD5值,不为空#如果第一个参数是目录,那么调用getDirectoryAllFileMD5计算目录里面所有文件的MD5值#如果第一个参数是文件,那么调用getSingleFileMD5计算命令行参数里面所有文件的MD5值if(@ARGV){my$arg=$ARGV[0];if(-d$arg){if($ARGV[1]eq'-f' -T$ARGV[2]){ compareWithLastMD5File($arg);}else{ getDirectoryAllFileMD5(@ARGV);}}elsif(-f$arg){ getSingleFileMD5(@ARGV);}elsif($argeq'-c' @ARGV==3){die $usagecompare\n unless(-T$ARGV[1] -T$ARGV[2]); compareWithTwoMD5Files;}elsif($argeq'-p'){if(1==@ARGV){ getPathBinFileMD5;}elsif($ARGV[1]eq'-f' -T$ARGV[2]){ compareWithLastPathMD5File;}else{die $usagepath\n ;}}else{die $usage\n ;}}else{die $usage\n ;}#得到目录下所有文件(包括子目录)的MD5值subgetDirectoryAllFileMD5{find(\ wantedPrint,@_);}#得到PATH变量里面所有的二进制文件的MD5值subgetPathBinFileMD5{my@path=split/:/,$ENV{PATH};find(\ wantedPrint,@path);}#先得到本次PATH变量所有的目录下的文件的MD5值,然后对比以前是生成的MD5文件subcompareWithLastPathMD5File{my@path=split/:/,$ENV{PATH}; compareWithLastMD5File(@path);}#得到单个文件的MD5值subgetSingleFileMD5{foreach(@_){if(-R$_){print $_ , getMD5($_), \n ;}else{print Can'tread$_\n ;next;}}}#先生成该目录下所有文件的MD5值,然后跟上一次该目录的生成的MD5文件对比#本次生成的MD5跟上一次生成的MD5文件比对,不一致的输出出来,同时将3个时间输出出来#如果是新添加的文件则输出出来其3个时间值,atimemtimectimesubcompareWithLastMD5File{find(\ wantedHash,@_);#这里调用那个回调函数后就会生成一个%thisMD5Hash的哈希my$md5file=$ARGV[2];openLASTMD5FILE, , $md5file ordie Can'tread$md5file:$!\n ;my$lastMD5Filerecords=(@lastMD5FilerecordsArray= LASTMD5FILE %lastMD5Hash=map{split}@lastMD5FilerecordsArray;closeLASTMD5FILE;foreach(keys%thisMD5Hash){$thisMD5Filerecords++;} compare($thisMD5Filerecords,$lastMD5Filerecords);}#比较2个生成的MD5文件(对同一个目录生成的),找出不同的或者不存在的subcompareWithTwoMD5Files{my($md5file1,$md5file2)=($ARGV[1],$ARGV[2]);openMD5FILE1, , $md5file1 ordie Can'tread$md5file1:$!\n ;openMD5FILE2, , $md5file2 ordie Can'tread$md5file2:$!\n ;my$file1record=(@file1record= MD5FILE1 my$file2record=(@file2record= MD5FILE2 closeMD5FILE1;closeMD5FILE2;%thisMD5Hash=map{split}@file1record;%lastMD5Hash=map{split}@file2record; compare($file1record,$file2record);}#对2个MD5文件进行比较或者是边生成边比对subcompare{my($file1record,$file2record)=($_[0],$_[1]);if($file1record =$file2record){%hash1=%thisMD5Hash;%hash2=%lastMD5Hash;}else{%hash1=%lastMD5Hash;%hash2=%thisMD5Hash;}my$count=0;foreach(keys%hash1){if(exists$hash2{$_}){if($hash1{$_}ne$hash2{$_}){$count++;($atime,$mtime,$ctime)= getFileAMCTime($_);print Different-- $_\n ;print $hash2{$_}\n ;print $hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n\n ;}}else{$count++;if(-e$_){($atime,$mtime,$ctime)= getFileAMCTime($_);print Added-- $_\n$hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n\n ;}else{print Deleted-- $_$hash1{$_}\n\n ;}}}if($count==0){print NotFoundDifferent!!\n ;}}#遍历条件,找到之后输出subwantedPrint{if(-f$_ -R$_){print $File::Find::name , getMD5($_), \n ;}}#遍历条件,找到之后形成一个HASHsubwantedHash{if(-f$_ -r$_){$thisMD5Hash{$File::Find::name}= getMD5($_);}}#计算MD5值subgetMD5{my$file=shift@_;open(FH,$file)ordie Can'topen'$file':$!\n ;binmode(FH);my$filemd5=Digest::MD5- new- addfile(FH)- hexdigest;closeFH;return$filemd5;}#获取文件的atime,mtime,ctimesubgetFileAMCTime{$filename=shift@_;my($atime,$mtime,$ctime)=(stat($filename))[8,9,10];$atime= getTime($atime);$mtime= getTime($mtime);$ctime= getTime($ctime);#将日期时间格式转换为比较友好的格式subgetTime{my$time=shift@_;my($sec,$min,$hour,$day,$mon,$year)=(localtime$time)[0..5];$time=sprintf %4d-%02d-%02d%2d:%02d:%02d ,$year+1900,$mon+1,$day,$hour,$min,$sec;return$time;}return$atime,$mtime,$ctime;}

【第一版】

#!/usr/bin/perluse Digest::MD5;use File::Find;# 2012-11-24 22:41 Leo chanyipiaomiao@163.com# Blog:http://linux5588.blog.51cto.com#用法提示$usage= Usage:scriptname-p|Directory1...|File1...|-cMD5File1MD5File2|Directory-fMD5File[ OUTFILE] ;$usagecompare= Usage:scriptname-cMD5File1MD5File2[ OUTFILE] ;$usagepath= Usage:scriptname-p[ OUTFILE] ;#判断命令行参数是否为空,为空则直接计算PATH路径里面所有的二进制文件的MD5值,不为空#如果第一个参数是目录,那么调用getDirectoryAllFileMD5计算目录里面所有文件的MD5值#如果第一个参数是文件,那么调用getSingleFileMD5计算命令行参数里面所有文件的MD5值if(@ARGV){my$arg=$ARGV[0];if(-d$arg){if($ARGV[1]eq'-f' -T$ARGV[2]){ compareWithLastMD5File($arg);}else{ getDirectoryAllFileMD5(@ARGV);}}elsif(-f$arg){ getSingleFileMD5(@ARGV);}elsif($argeq'-c' @ARGV==3){die $usagecompare\n unless(-T$ARGV[1] -T$ARGV[2]); compareWithTwoMD5Files;}elsif($argeq'-p'){die $usagepath\n unless(@ARGV==1); getPathBinFileMD5;}else{die $usage\n ;}}else{die $usage\n ;}#得到目录下所有文件(包括子目录)的MD5值subgetDirectoryAllFileMD5{find(\ wantedPrint,@_);}#得到PATH变量里面所有的二进制文件的MD5值subgetPathBinFileMD5{my@path=split/:/,$ENV{PATH};find(\ wantedPrint,@path);}#得到单个文件的MD5值subgetSingleFileMD5{foreach(@_){if(-R$_){print $_ , getMD5($_), \n ;}else{print Can'tread$_\n ;next;}}}#先生成该目录下所有文件的MD5值,然后跟上一次该目录的生成的MD5文件对比#本次生成的MD5跟上一次生成的MD5文件比对,不一致的输出出来,同时将3个时间输出出来#如果是新添加的文件则输出出来其3个时间值,atimemtimectimesubcompareWithLastMD5File{find(\ wantedHash,@_);my$md5file=$ARGV[2];openMD5FILE, , $md5file ordie Can'tread$md5file:$!\n ;my$lastMD5Filerecords=(@lastMD5FilerecordsArray= MD5FILE my%lastMD5Hash=map{split}@lastMD5FilerecordsArray;closeMD5FILE;foreach(keys%thisMD5Hash){$thisMD5Filerecords++;}if($thisMD5Filerecords =$lastMD5Filerecords){%hash1=%thisMD5Hash;%hash2=%lastMD5Hash;}else{%hash1=%lastMD5Hash;%hash2=%thisMD5Hash;}foreach(keys%hash1){if(exists$hash2{$_}){if($hash1{$_}ne$hash2{$_}){($atime,$mtime,$ctime)= getFileAMCTime($_);print Different:$_$hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n ;}}else{if(-e$_){($atime,$mtime,$ctime)= getFileAMCTime($_);print Added:$_$hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n ;}else{print Deleted:$_$hash1{$_}\n ;}}}}#比较2个生成的MD5文件(对同一个目录生成的),找出不同的或者不存在的subcompareWithTwoMD5Files{my($md5file1,$md5file2)=($ARGV[1],$ARGV[2]);openMD5FILE1, , $md5file1 ordie Can'tread$md5file1:$!\n ;openMD5FILE2, , $md5file2 ordie Can'tread$md5file2:$!\n ;my$file1record=(@file1record= MD5FILE1 my$file2record=(@file2record= MD5FILE2 closeMD5FILE1;closeMD5FILE2;my%hashmap1=map{split}@file1record;my%hashmap2=map{split}@file2record;if($file1record =$file2record){%hash1=%hashmap1;%hash2=%hashmap2;}else{%hash1=%hashmap2;%hash2=%hashmap1;}foreach(keys%hash1){if(exists$hash2{$_}){if($hash1{$_}ne$hash2{$_}){($atime,$mtime,$ctime)= getFileAMCTime($_);print Different:$_$hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n ;}}else{if(-e$_){($atime,$mtime,$ctime)= getFileAMCTime($_);print Added:$_$hash1{$_}Atime:$atimeMtime:$mtimeCtime:$ctime\n ;}else{print Deleted:$_$hash1{$_}\n ;}}}}#遍历条件,找到之后输出subwantedPrint{if(-f$_ -R$_){print $File::Find::name , getMD5($_), \n ;}}#遍历条件,找到之后形成一个HASHsubwantedHash{if(-f$_ -r$_){$thisMD5Hash{$File::Find::name}= getMD5($_);}}#计算MD5值subgetMD5{my$file=shift@_;open(FH,$file)ordie Can'topen'$file':$!\n ;binmode(FH);my$filemd5=Digest::MD5- new- addfile(FH)- hexdigest;closeFH;return$filemd5;}#获取文件的atime,mtime,ctimesubgetFileAMCTime{$filename=shift@_;my($atime,$mtime,$ctime)=(stat($filename))[8,9,10];$atime= getTime($atime);$mtime= getTime($mtime);$ctime= getTime($ctime);#将日期时间格式转换为比较友好的格式subgetTime{my$time=shift@_;my($sec,$min,$hour,$day,$mon,$year)=(localtime$time)[0..5];$time=sprintf %4d-%02d-%02d%2d:%02d:%02d ,$year+1900,$mon+1,$day,$hour,$min,$sec;return$time;}return$atime,$mtime,$ctime;}

附件:http://down.51cto.com/data/2361830

人生难免有挫折,但你是逃避不了的,一定要去面对它

Linux下计算文件的MD5值推荐

相关文章:

你感兴趣的文章:

标签云: