+ -
当前位置:首页 → 问答吧 → Perl 取文件大小问题

Perl 取文件大小问题

时间:2010-12-17

来源:互联网

本帖最后由 mitmax 于 2010-12-17 08:55 编辑
  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @Re=`dir /b /s /a-d D:\\Offline`;
  4. my @FileName=('Logs','Web.config','Config');
  5. #my $AR=scalar(@FileName);
  6. #print $AR,"\n";
  7. my $size=0;;
  8. foreach  (@Re){
  9.         chomp;
  10.         
  11.         foreach my $i (@FileName){
  12.         if ($_ =~ /.*?($i).*?/){
  13.                 print "过滤 $_ \n";
  14.         }else{
  15.                 $size =$size +  -s $_;
  16.         }
  17.   }
  18.         
  19. }
  20. print $size,"\n";
复制代码

这个是结果
  1. 过滤 D:\Offline\Web.config
  2. 过滤 D:\Offline\App_Data\Business\ClientConfig.xml
  3. 过滤 D:\Offline\bin\Microsoft.Practices.Unity.Configuration.dll
  4. 过滤 D:\Offline\bin\PES.Beehive.Configuration.dll
  5. 过滤 D:\Offline\bin\PES.Beehive.Configuration.Entity.dll
  6. 过滤 D:\Offline\bin\PES.Beehive.Configuration.Infrastructure.dll
  7. 过滤 D:\Offline\Config\Develop\hibernate-initialization.config
  8. 过滤 D:\Offline\Config\Develop\policyInjection.config
  9. 过滤 D:\Offline\Config\Develop\syscache.config
  10. 过滤 D:\Offline\Config\Develop\unity.config
  11. 过滤 D:\Offline\Config\Environment\appSettings.config
  12. 过滤 D:\Offline\Config\Environment\hibernate-configuration.config
  13. 过滤 D:\Offline\Config\Environment\log4net.config
  14. 2093850
复制代码

我想取一个目录的的大小, 但是我又想实现过滤掉 里面的某些目录 ,和文件  但是这个好像没匹配目录,倒是匹配了文件名  高手帮忙改下Config  Logs 是目录 Web.config是文件

还有下面这个为什么一个文件会匹配3次
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use File::Find;

  4. my $path = 'D:\\Offline';
  5. my @FileName=('/Logs/','Web.config','/Config/');
  6. my $size=0;
  7. sub wanted {
  8.     if ( -f $File::Find::name ) {
  9.             foreach my $i (@FileName){
  10.                      if ( $File::Find::name =~ /$i/ ) {
  11.            print  "过滤: $File::Find::name\n";
  12.            
  13.         }else{
  14.                 print "匹配: $File::Find::name\n";
  15.                 $size =$size +  -s $File::Find::name;
  16.                
  17.         }
  18.             }
  19.       
  20.     }

  21. }

  22. find( \&wanted, $path );
  23. print $size;
复制代码


  1. 匹配: D:\Offline/Config/Develop/policyInjection.config匹配: D:\Offline/Config/Develop/policyInjection.config过滤: D:\Offline/Config/Develop/policyInjection.config匹配: D:\Offline/Config/Develop/syscache.config匹配: D:\Offline/Config/Develop/syscache.config过滤: D:\Offline/Config/Develop/syscache.config匹配: D:\Offline/Config/Develop/unity.config匹配: D:\Offline/Config/Develop/unity.config过滤: D:\Offline/Config/Develop/unity.config匹配: D:\Offline/Config/Environment/appSettings.config匹配: D:\Offline/Config/Environment/appSettings.config过滤: D:\Offline/Config/Environment/appSettings.config匹配: D:\Offline/Config/Environment/hibernate-configuration.config匹配: D:\Offline/Config/Environment/hibernate-configuration.config过滤: D:\Offline/Config/Environment/hibernate-configuration.config匹配: D:\Offline/Config/Environment/log4net.config匹配: D:\Offline/Config/Environment/log4net.config
复制代码

作者: mitmax   发布时间: 2010-12-17

因为你的for循环,会执行三次,而找到的每个文件都会和你需要过滤的文件名,因为你需要过滤的有三个关键字,所以匹配三次

作者: scrit   发布时间: 2010-12-17



QUOTE:
因为你的for循环,会执行三次,而找到的每个文件都会和你需要过滤的文件名,因为你需要过滤的有三个关键字, ...
scrit 发表于 2010-12-17 09:32



my @FileName=('/Logs/','Web.config','/Config/');  应该是遍历吧,不是一个名字匹配3次吧

作者: mitmax   发布时间: 2010-12-17

回复 mitmax


    你是想做遍历的,但是计算机程序认为你那是三个需要比较的变量,所以在for循环了,把找到的每个文件名,与这三个变量比较了三次。不信的话,你可以把那三个字段增加或者减少,你就会发现

作者: scrit   发布时间: 2010-12-17



QUOTE:
回复  mitmax


    你是想做遍历的,但是计算机程序认为你那是三个需要比较的变量,所以在for循环了, ...
scrit 发表于 2010-12-17 10:09




   大哥你能不能再我的代码上帮忙该系

作者: mitmax   发布时间: 2010-12-17

回复 mitmax


    我也是才学习perl不久的,这是我写的希望对你有用,你试试
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use File::Find;

  4. my $path = 'D:\\Offline';
  5. my @FileName=('/Log/','web\.config','/Config/');
  6. my $size=0;
  7. my $flag = 0;
  8. sub wanted {
  9.     if ( -f $File::Find::name )
  10.     {

  11.            foreach my $i (@FileName)
  12.           {
  13.                if ( $File::Find::name =~ /$i/ )
  14.                 {
  15.                  print  "过滤: $File::Find::name\n";
  16.                   $flag = 0;
  17.                  last;

  18.                 }
  19.                else
  20.                 {
  21.                 $flag = $flag +1;
  22.                  }
  23.               if($flag eq 3 )      # 这里要看数组里有几个变量,就设置为几
  24.                 {
  25.                  print "匹配: $File::Find::name\n";
  26.                  $size =$size +  -s $File::Find::name;
  27.                   $flag = 0;
  28.                  last;
  29.                  }
  30.           }

  31.     }

  32. }

  33. find( \&wanted, $path );
  34. print $size;
复制代码

作者: scrit   发布时间: 2010-12-17