perl 查看每个文件夹中的每个文件大小,并打印出来。

查看目录下所有文件的大小,文件夹中可能还有子文件夹。
2025-05-06 20:26:54
推荐回答(1个)
回答1:

参考我这个程序吧,这是个递归访问每个子目录,并列出文件。你在里面根据取出的文件,使用stat函数取出其文件大小并显示就可以了。

或者使用File::Find模块,也很简单的。

#!/usr/bin/perl -wl

### REWRITE THIS USING File::Find

use File::Basename;
use strict;
use warnings;

@ARGV or die "usage: $0 directory [depth]\n";
@ARGV == 2 and ($ARGV[1] > 0 or die "usage: $0 directory [depth]\n");
$main::WANT_SORTED_OUTPUT = 0;

my $root = shift;
my $depth = int(shift || -1);
my $indent = 0;
my ($gap,   $reg,   $dir,  $link,  $spec,  $stop, $unread) =
   ("|   ", "|---", "+-", ">---", "*---", "++", "XXX-");

die "$root is not a directory\n" unless -d $root;

recurse($root);


sub recurse {
  my $dir = shift;

  print basename($dir) if !$indent++;
  unless (-r $dir) {
    print " ", $gap x ($indent - 1), $unread;
  }
  else {
    local *DIR;
    opendir DIR, $dir;
    if ($main::WANT_SORTED_OUTPUT) {
      for (map $_->[0], sort { $a->[1] cmp $b->[1] } map [ $_, lc ], readdir DIR) {
        next if /^\.\.?$/;
        print " ", $gap x ($indent - 1), (prefix("$dir/$_")), $_;
        recurse("$dir/$_") if $indent != $depth and -d "$dir/$_" and !-l "$dir/$_";
      }
    }
    else {
      while (defined(local $_ = readdir DIR)) {
        next if /^\.\.?$/;
        print " ", $gap x ($indent - 1), (prefix("$dir/$_")), $_;
        recurse("$dir/$_") if $indent != $depth and -d "$dir/$_" and !-l "$dir/$_";
      }
    }
    closedir DIR;
  }
  print " ", $gap x (--$indent || 1);
}


sub prefix {
  my $file = shift;
  -l $file ? $link :
  -d $file && $indent != $depth ? $dir :
  -d _ ? $stop :
  -f _ ? $reg :
  $spec;
}