perl脚本之__分类统计某一目录下指定类型文件的大小
2008-12-22 11:43
801 查看
先介绍一下写此脚本的背景,我们使用samba共享,每个人都有自己的个人目录,和群组共用目录,现在发现磁盘空间消耗的很厉害,上服务查一下才发现在,好多人在个人目录下放了好多mp3,图片,视频之类的文件,为了提高服务器利用率,所以决定对服务器上这此文件都进行统计,然后通知个人进行处理,不然就删除。
脚本分成两部分,第一查找出指定目录下所指定查找类型的文件(mp3,jpeg,etc.),把文件路径和大小写入指定文件,第二部分是对第一步生成那个文件进行分析,统计出每个人的个人目录下,每种文件总大小,
个人文件夹路径模式如下:/data/incoming/username/music/xxxx.mp3
第一部分代码:
#!/usr/bin/perl -W
#
# File: find_file.pl
# Author:sunrocs
# License: GPL-2
use strict;
use warnings;
my $ori_dir=shift;
chomp($ori_dir);
my $to_file=(split(////,$ori_dir))[2].".txt"; #
sub lsr_s($) {
my $cwd = shift;
my @dirs = ($cwd.'/');
my ($dir, $file);
while ($dir = pop(@dirs)) {
local *DH;
if (!opendir(DH, $dir)) {
warn "Cannot opendir $dir: $! $^E";
next;
}
foreach (readdir(DH)) {
if ($_ eq '.' || $_ eq '..') {
next;
}
$file = $dir.$_;
if (!-l $file && -d _) {
$file .= '/';
push(@dirs, $file);
}
&process($file,$dir);
}
closedir(DH);
}
}
my ($sizecnt) = (0);
sub process($$) {
my $file = shift;
if ($file=~/(/.rmvb|/.mpg|/.mpeg|/.wmv|/.rm|/.avi|/.mp3|/.jpeg|/.jpg|/.png|/.gif)$/) {
my $size= -s $file;
$sizecnt+=$size;
$file=~/.*//.+/.(/w+)$/;
my $type=$1;
&write_to_file($file,$size,$type);
}
}
sub write_to_file {
my ($file,$size,$type)=@_;
my $line=$file."###".$size."###".$type."/n";
open FH,">>$to_file" or die $!."/n";
print FH $line;
close(FH);
}
lsr_s($ori_dir);
&write_to_file($ori_dir."/total/",$sizecnt,"total");
生成文件内容格式如下:
/data/incoming/zhangs/photos/test.jpg###63712###jpg
......
/data/incoming/total/###19000000###total
第二部分代码是对第一部分生成的文件进行分析,代码如下:
#!/usr/bin/perl
use strict;
my $file=shift;
chomp($file);
my $to_file="total_".$file;
open(FILE,$file) or die "cannot open $!";
my @lines=;
close(FILE);
foreach(@lines){
my $user=(split(////,$_))[3];
open TMP,">>./tmpfile" or die "cannot opent $!";
print TMP $user."/n";
close (TMP);
}
system("sort -u ./tmpfile > ./tmpfile2");
open (FILE,"./tmpfile2") or die "cannot open $!";
my @users=;
close (FILE);
system("rm -f ./tmpfile ./tmpfile2");
foreach my $name(@users){
chomp($name);
my %tmp;
foreach my $line(@lines){
chomp($line);
if($line=~///$name///){
my $size=(split(/###/,$line))[1];
if($line=~/(rmvb|dat|mpeg|mpg|wmv|rm|avi)$/){
$tmp{video}+=$size;
}
elsif($line =~/(jpeg|jpg|gif|png)$/){
$tmp{photo}+=$size;
}
elsif($line =~/mp3$/){
$tmp{mp3}+=$size;
}
elsif($size>1000000000){
$tmp{bigfile}+=$size;
}
}
}
open FH,">>./$to_file" or die "cannot open $!";
print FH $name."/n";
foreach my $obj(keys(%tmp)){
my $total_size=&modi_size($tmp{$obj});
print FH " ".$obj." ".":"." ".$total_size."/n";
}
}
sub modi_size{
my $size=shift;
if(($size>1000) && ($size<1000000)){
$size=$size/1000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="K";
}
elsif(($size>=1000000) &&($size<1000000000)){
$size=$size/1000000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="M";
}
elsif($size>=1000000000){
$size=$size/1000000000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="G";
}
return $size;
}
生成最后的统计文件内容格式如下:
user1
mp3 : 49.4M
video : 337.7M
photo : 1.0G
user2
video : 3.5G
photo : 4.8M
user3
photo : 7.0M
total : 98G
此处之所以分成两步,因为中间生成的那个文件还有它用,如果需要,很容易将两段代码合并。
转载请注明作者、出处!
脚本分成两部分,第一查找出指定目录下所指定查找类型的文件(mp3,jpeg,etc.),把文件路径和大小写入指定文件,第二部分是对第一步生成那个文件进行分析,统计出每个人的个人目录下,每种文件总大小,
个人文件夹路径模式如下:/data/incoming/username/music/xxxx.mp3
第一部分代码:
#!/usr/bin/perl -W
#
# File: find_file.pl
# Author:sunrocs
# License: GPL-2
use strict;
use warnings;
my $ori_dir=shift;
chomp($ori_dir);
my $to_file=(split(////,$ori_dir))[2].".txt"; #
sub lsr_s($) {
my $cwd = shift;
my @dirs = ($cwd.'/');
my ($dir, $file);
while ($dir = pop(@dirs)) {
local *DH;
if (!opendir(DH, $dir)) {
warn "Cannot opendir $dir: $! $^E";
next;
}
foreach (readdir(DH)) {
if ($_ eq '.' || $_ eq '..') {
next;
}
$file = $dir.$_;
if (!-l $file && -d _) {
$file .= '/';
push(@dirs, $file);
}
&process($file,$dir);
}
closedir(DH);
}
}
my ($sizecnt) = (0);
sub process($$) {
my $file = shift;
if ($file=~/(/.rmvb|/.mpg|/.mpeg|/.wmv|/.rm|/.avi|/.mp3|/.jpeg|/.jpg|/.png|/.gif)$/) {
my $size= -s $file;
$sizecnt+=$size;
$file=~/.*//.+/.(/w+)$/;
my $type=$1;
&write_to_file($file,$size,$type);
}
}
sub write_to_file {
my ($file,$size,$type)=@_;
my $line=$file."###".$size."###".$type."/n";
open FH,">>$to_file" or die $!."/n";
print FH $line;
close(FH);
}
lsr_s($ori_dir);
&write_to_file($ori_dir."/total/",$sizecnt,"total");
生成文件内容格式如下:
/data/incoming/zhangs/photos/test.jpg###63712###jpg
......
/data/incoming/total/###19000000###total
第二部分代码是对第一部分生成的文件进行分析,代码如下:
#!/usr/bin/perl
use strict;
my $file=shift;
chomp($file);
my $to_file="total_".$file;
open(FILE,$file) or die "cannot open $!";
my @lines=;
close(FILE);
foreach(@lines){
my $user=(split(////,$_))[3];
open TMP,">>./tmpfile" or die "cannot opent $!";
print TMP $user."/n";
close (TMP);
}
system("sort -u ./tmpfile > ./tmpfile2");
open (FILE,"./tmpfile2") or die "cannot open $!";
my @users=;
close (FILE);
system("rm -f ./tmpfile ./tmpfile2");
foreach my $name(@users){
chomp($name);
my %tmp;
foreach my $line(@lines){
chomp($line);
if($line=~///$name///){
my $size=(split(/###/,$line))[1];
if($line=~/(rmvb|dat|mpeg|mpg|wmv|rm|avi)$/){
$tmp{video}+=$size;
}
elsif($line =~/(jpeg|jpg|gif|png)$/){
$tmp{photo}+=$size;
}
elsif($line =~/mp3$/){
$tmp{mp3}+=$size;
}
elsif($size>1000000000){
$tmp{bigfile}+=$size;
}
}
}
open FH,">>./$to_file" or die "cannot open $!";
print FH $name."/n";
foreach my $obj(keys(%tmp)){
my $total_size=&modi_size($tmp{$obj});
print FH " ".$obj." ".":"." ".$total_size."/n";
}
}
sub modi_size{
my $size=shift;
if(($size>1000) && ($size<1000000)){
$size=$size/1000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="K";
}
elsif(($size>=1000000) &&($size<1000000000)){
$size=$size/1000000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="M";
}
elsif($size>=1000000000){
$size=$size/1000000000;
$size=~s/(/d+/./d)/d+/$1/;
$size.="G";
}
return $size;
}
生成最后的统计文件内容格式如下:
user1
mp3 : 49.4M
video : 337.7M
photo : 1.0G
user2
video : 3.5G
photo : 4.8M
user3
photo : 7.0M
total : 98G
此处之所以分成两步,因为中间生成的那个文件还有它用,如果需要,很容易将两段代码合并。
转载请注明作者、出处!
相关文章推荐
- Perl脚本递归替换所有指定目录指定文件类型中的指定模式
- shell统计指定目录下所有文件类型及数量
- 很实用的sh脚本,【批量文件替换】【ssh远程命令执行】【统计某一目录下面所有文档总行数】等
- shell统计指定目录下所有文件类型及数量
- 编写一个SHELL脚本,可以获得指定目录下的所有文件及文件夹的大小。输出的样式与 ls -lh 命令相同。
- Shell脚本实例(二) 向指定目录下不断产生指定大小的文件
- 统计指定目录下面的文件类型及数量
- Shell脚本统计指定目录下子目录中的文件个数
- python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小
- 删除365天前指定目录下指定类型文件 perl
- 获取指定目录下指定类型所有文件的全路径及文件名
- 自己写的一个图片上传类,很方便可以指定目录,系统自动创建目录,可以指定名字,类型,大小
- Linux下查看某目录或指定文件大小的命令
- linux Shell: 定时清理指定目录下大于指定大小、指定文件名的文件?
- C++及API函数实现查找某目录下指定类型的文件
- Linux复制指定目录及子目录下特定类型的文件
- [Shell]在一个目录及其子目录内的指定类型的文件中搜索某个字符串
- python某一目录下指定格式的文件路径保存到指定格式的文件中
- Java遍历列出某一目录下的文件及文件夹,寻找某一指定文件
- linux下用python统计某个目录下指定后缀文件的个数