脚本功能

脚本使用Perl编写,计算文件的MD5值

脚本用途

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

脚本用法(5种用法)

脚本名 -p [ > 输出的文件名] ← 该功能是计算PATH变量里面所有文件的MD5值

脚本名 文件1 文件2 文件3 ... [ > 输出的文件名] ← 该功能是计算指定文件的MD5值

脚本名 目录1 目录2 目录3 ... [ > 输出的文件名] ← 该功能是计算指定目录下所有文件的MD5值

脚本名 -c MD5文件1 MD5文件2 [ > 输出的文件名] ← 该功能是比较同一个目录下所有文件生成的2次MD5文件中有哪些MD5值不一致

脚本名 目录 -f MD5文件 [ > 输出的文件名] ← 该功能是跟上面的功能类似,只是这个不生成文件直接比对

注意事项

不能对/proc目录进行计算

不能对/(根)进行计算,因为/里面包含/proc

不能对挂载在Linux上Windows的共享目录进行计算

脚本内容

#!/usr/bin/perl

use 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 ... | -c MD5File1 MD5File2 | Directory -f MD5File [ > OUTFILE]";

$usagecompare = "Usage: scriptname -c MD5File1 MD5File2 [ > 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 ($arg eq '-c' && @ARGV == 3 ) {

die "$usagecompare\n" unless (-T $ARGV[1] && -T $ARGV[2]);

&compareWithTwoMD5Files;

} elsif ($arg eq '-p') {

die "$usagepath\n" unless (@ARGV == 1);

&getPathBinFileMD5;

} else {

die "$usage\n";

}

} else {

die "$usage\n";

}

#得到目录下所有文件(包括子目录)的MD5值

sub getDirectoryAllFileMD5 {

find(\&wantedPrint,@_);

}

#得到PATH变量里面所有的二进制文件的MD5值

sub getPathBinFileMD5 {

my @path = split /:/,$ENV{PATH};

find(\&wantedPrint,@path);

}

#得到单个文件的MD5值

sub getSingleFileMD5 {

foreach (@_) {

if (-R $_) {

print "$_ ",&getMD5($_),"\n";

} else {

print "Can't read $_\n";

next;

}

}

}

#先生成该目录下所有文件的MD5值,然后跟上一次该目录的生成的MD5文件对比

#本次生成的MD5跟上一次生成的MD5文件比对,不一致的输出出来,同时将3个时间输出出来

#如果是新添加的文件则输出出来其3个时间值,atime mtime ctime

sub compareWithLastMD5File {

find(\&wantedHash,@_);

my $md5file = $ARGV[2];

open MD5FILE,"

my $lastMD5Filerecords = (@lastMD5FilerecordsArray = );

my %lastMD5Hash = map { split } @lastMD5FilerecordsArray;

close MD5FILE;

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:$atime Mtime:$mtime Ctime:$ctime\n";

}

} else {

if (-e $_) {

($atime,$mtime,$ctime) = &getFileAMCTime($_);

print "Added:$_ $hash1{$_} Atime:$atime Mtime:$mtime Ctime:$ctime\n";

} else {

print "Deleted:$_ $hash1{$_}\n";

}

}

}

}

#比较2个生成的MD5文件(对同一个目录生成的),找出不同的或者不存在的

sub compareWithTwoMD5Files {

my ($md5file1,$md5file2) = ($ARGV[1],$ARGV[2]);

open MD5FILE1,"

open MD5FILE2,"

my $file1record = (@file1record = );

my $file2record = (@file2record = );

close MD5FILE1;

close MD5FILE2;

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:$atime Mtime:$mtime Ctime:$ctime\n";

}

} else {

if (-e $_) {

($atime,$mtime,$ctime) = &getFileAMCTime($_);

print "Added:$_ $hash1{$_} Atime:$atime Mtime:$mtime Ctime:$ctime\n";

} else {

print "Deleted:$_ $hash1{$_}\n";

}

}

}

}

#遍历条件,找到之后输出

sub wantedPrint {

if (-f $_ && -R $_) {

print "$File::Find::name ",&getMD5($_),"\n";

}

}

#遍历条件,找到之后形成一个HASH

sub wantedHash {

if (-f $_ && -r $_) {

$thisMD5Hash{$File::Find::name} = &getMD5($_);

}

}

#计算MD5值

sub getMD5 {

my $file = shift @_;

open(FH, $file) or die "Can't open '$file': $!\n";

binmode(FH);

my $filemd5 = Digest::MD5->new->addfile(FH)->hexdigest;

close FH;

return $filemd5;

}

#获取文件的atime,mtime,ctime

sub getFileAMCTime {

$filename = shift @_;

my ($atime,$mtime ,$ctime) = (stat ($filename))[8,9,10];

$atime = &getTime($atime);

$mtime = &getTime($mtime);

$ctime = &getTime($ctime);

#将日期时间格式转换为比较友好的格式

sub getTime {

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;

}

linux 文件md5,Linux下计算文件的MD5值相关推荐

  1. Linux和Windows下计算文件的Hash值

    Linux和Windows下计算文件的Hash值 MD和SHA简介 MD SHA MD5 SHA1标识文件唯一性 Linux Windows 不需要下载工具,也不需要写代码. MD和SHA简介 MD ...

  2. linux shell判断当前目录下的文件或目录

    linux shell判断当前目录下的文件或目录 #!bin/sh for file in ./* doif test -f $filethenecho $file 是文件elseecho $file ...

  3. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、样本量的情况下计算假设检验的效用值

    R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis).在已知效应量(effect size).显著性水平(sig).样本量(sample s ...

  4. Linux /proc/pid目录下相应文件的信息说明和含义

    Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上.Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux变得更加特别 ...

  5. linux怎么在目录下查找文件,linux find-在指定目录下查找文件

    find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录和文件全部进 ...

  6. linux如何统计目录下的文件个数,linux怎么查看一个目录下的文件数量

    有时候需要看文件夹下有多少文件,那么就需要用到以下指令 $ls -l | grep -c '^-' 个grep是啥意思呢?我们man一下 $man grep 会看到以下描述: SYNOPSIS gre ...

  7. 【Linux】了解根目录下每个文件的作用

           根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也不开机/还原/系统修复等动作有关. 由于系统开机时需要特定的开机软件.核心档案.开机所需程序. ...

  8. linux怎样在根目录下创建文件夹

    展开全部 linux如何用命令创建新建文件夹 首先说一下touch 创建文件的命令,touch可以用于创建二进制文件,用法非常简单.用法:touch+文件名,touch与文件名之间一定要有空格.图中先 ...

  9. linux显示 zbj目录下的文件,ZBJ 文件扩展名: 它是什么以及如何打开它?

    解决难以打开 ZBJ 文件的问题 打开 ZBJ 文件过程中所遇到的常见问题 Unknown Software 已删除 尝试打开 ZBJ 时,你会遇到一条错误消息,例如 "%%os%% 无法打 ...

最新文章

  1. 12306系统的秒杀“艺术”:如何抗住100万人同时抢1万张票?
  2. Asp.net中文件上传下载的简单实现
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1091:求阶乘的和
  4. Kibana安装配置
  5. yii之behaviors
  6. stl向量_用户定义大小的C ++ STL中的2D向量
  7. micropython仿真器_Micropython教程之TPYBoard DIY超声波测距仪实例演示
  8. 【转】刨根究底字符编码之十二——UTF-8究竟是怎么编码的
  9. 华为庞鑫:闪存3.0时代,四大变化激发全闪存数据中心潜能释放
  10. vscode比较整个文件夹_vscode开发ROS1(5)-ROS工程目录结构
  11. 分布式系统:数据库、操作系统、集群、协调、接口、多处理器、共享、I/O
  12. [Python2] List-comprehensions 列表推导式
  13. 移动网络设备睁开均盘绕Linux睁开
  14. 华为认证hcia含金量_华为hcna认证含金量高吗?
  15. unison与fswatch文件同步
  16. 苹果个人开发者账号出售_国内苹果企业级开发者账号申请需要多久
  17. 图像和音频格式解析一览
  18. mac升级python版本_Mac上python如何升级?
  19. 7-123 空心字母金字塔 (10 分)输入一个大写的英文字母,输出空心的字母金字塔。
  20. 2021年度中职组“网络空间安全”赛项湖南省竞赛任务书

热门文章

  1. Python 基础 之 词云(词的频率统计大小成图)的简单实现(包括图片词云,词云颜色,词的过滤)
  2. 计算机图形学--动画与模拟
  3. 科学的失控与范式的超越——《侏罗纪公园》读后感
  4. 蓝桥杯嵌入式解决LCD与LED冲突的方法
  5. struct所占的内存
  6. 新能源行业商业采购协同系统:赋能新能源行业采购业务,提升产业协同
  7. Mysql服务器安装步骤
  8. GOplot教程-GO柱状图(有点丑)-数据整理问题汇总
  9. 一度智信:拼多多商家开直通车大忌
  10. 去重数组中相同的字符串