当前位置:  技术问答>linux和unix

哪位高手能帮忙把以下代码改为shell或者实现该功能也行

    来源: 互联网  发布时间:2016-08-29

    本文导语:  先介绍一下写此脚本的背景,我们使用samba共享,每个人都有自己的个人目录,和群组共用目录,现在发现磁盘空间消耗的很厉害,上服务查一下才发现在,好多人在个人目录下放了好多mp3,图片,视频之类的文件,为...

先介绍一下写此脚本的背景,我们使用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=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
   


此处之所以分成两步,因为中间生成的那个文件还有它用,如果需要,很容易将两段代码合并。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/solarium/archive/2008/12/22/3581398.aspx

|
#!/bin/sh

# 指定目录
WORK_DIR=
# 统计
RESLT_FILE=

# step 1
for file_type in mp3 jpeg etc
do
    # 打印出大小,文件名,文件路径
find ${WORK_DIR} -name "*.${file_type}" | xargs ls -l | awk '{
arr_size=split($9,arr,"/");
print $5,arr[arr_size],$9
}' | awk 'sub("/"$2,"",$3){print $1,$2,$3}' > ${RESLT_FILE}

done

# step 2
awk '{a[$3" "$2]+=$1;a[$3" "$2]++}END{for (i in a) print i,a[i]}' ${RESLT_FILE}

    
 
 

您可能感兴趣的文章:

  • 急,请教一个将TCP数据包修改为UDP包的问题,高手请进!
  • webmail问题,请高手帮忙!!!谁会使用IMP 3.0????!!!
  • 高手帮忙解释
  • 那位高手帮忙 100分
  • ★★★在linux下编译pro*c文件,提示"sqlcxt"没有定义,哪位高手帮忙,定赠分!
  • 装linux遇到问题,有高手在线帮忙吗?请发信息给我
  • free BSD ROOT密码丢失。请高手帮忙
  • red hat 9 不能上网了,请高手帮忙
  • 如何获取 文件类型?文件更新日期?多谢高手帮忙!
  • 高手帮忙啊!!!主板内置声卡怎么安装啊!
  • 升级Linux的问题,急!请高手帮忙!
  • 高手帮忙!linux初次安装的问题?
  • 急!高手帮忙!cximage库在Linux下运行使用的问题。
  • 高手帮忙,pkg安装包结束后,如何启动GUI程序?
  • 请高手帮忙
  • 请高手帮忙想个shell脚本
  • 高手帮帮忙,SHELL脚本编程~~~~~~~~~~~~~~~~~~
  • 限制ssh登录,放开sftp登录,怎么办?跪求高手帮帮忙!
  • 不小心远程注销了linux,然后再进去时桌面不见?急!!在线等,高手帮忙啊!
  • 一个linux shell编程求素数问题 高手帮帮忙啊
  • 100分 , 请高手帮忙...,linux网络配制,得解立即结贴
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问高手:Ctrl+Alt+F1~F8可以切换虚拟终端,这个代码是在哪儿实现的?我搞不懂,最好指点源代码大概位置。
  • 想成为java高手必须读jdk源代码吗?
  • 请高手们解惑,关于源代码
  • 求助 ==> 代码移殖:从Linux到的Windows,请高手指点一二,谢谢啦
  • 请高手帮我解释一下这段代码!!!
  • shell 编程 从0到10求和 ,代码有错,请高手看看
  • 各路JAVA高手们,能否给我一个用JAVA写的简单聊天室代码?
  • 用rose试图生成java代码,提示如下错误,求教高手!
  • 高分寻求JSP/Servlet写的聊天室源代码?请各位高手帮忙!
  • 急需关于linux多线程的代码工程实例-高手请进啊
  • RedHat 7.2的源代码在哪里?各位高手有的话,麻烦提供一下
  • 我在JBotton中怎么关闭本JFram?---请高手指教,最好给个代码!
  • 高手看看这段代码错在哪里
  • 请路过的高手指点什么地方可以找到LDAP原代码?
  • 关于socket通信,C的代码,有个问题请教高手!
  • 高手进,只求思路,不求代码!
  • 有那些高手将linux内核源代码完整的看过一遍啊
  • 100分相送能帮我从LINUX下提取ISO9660的源代码的高手
  • 注意了!!100分求购java Telnet客户端代码!!!高手指点同样给分!!
  • 现急需bmp文件转换成jpg文件的java源代码,请高手们帮帮忙,分数可再加。
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 100分相送能帮我从LINUX下提取ISO9660的源代码的高手 iis7站长之家
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3