perl命令需要修改

perl命令需要修改

我需要修改以下 perl 命令:

perl -wE 'say for ((sort { -s $b <=> -s $a } </tmp/?>)[0..9]);'

要求:

  1. 它应该扫描目标目录内的所有子目录。
  2. 列出前 10 个文件及其大小和路径。

答案1

这个 perl 脚本将准确打印您需要的内容,它用于File::Find递归遍历。我曾经-f确保只有文件被推入哈希中

哈希%files具有filepath作为键和size作为其值。然后根据值进行排序并打印前 10 个结果

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my %files;
my $counter=0;
find( \&wanted, '<target directory>');
for my $file  ( sort {$files{$b} <=> $files{$a}}  keys%files){
        print "$file : $files{$file}\n";
        $counter++;
        if ($counter == 10){
                last;
        }
}


sub wanted {
  $files{"$File::Find::name"}=-s $File::Find::name if -f;
  return;

}

或者简单地使用一个数组来让它工作

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my @files;
my $counter=0;
find( \&wanted, '<target directory>');
for my $file  ( sort { -s $b <=> -s $a}  @files){
        my $size = -s $file;
        print "$file : $size\n"
        $counter++;
        if ($counter == 10){
                last;
}
sub wanted{
  push @files,$File::Find::name if -f;
  return;
}

答案2

使用文件::查找递归地遍历目录树:

perl -MFile::Find -wE '
    find(sub { push @all, $File::Find::name }, "/tmp");
    say for (sort { -s $b <=> -s $a } @all)[0..9]'

如果文件太多并且您收到Out of memory,请返回大小并使用 externalsorthead来限制输出:

perl -MFile::Find -wE 'find(sub { say -s $_, " $File::Find::name" }, "/tmp")' \
| sort -nr | head -n10

答案3

zsh -c 'ls -ldS /tmp/**/?(DOL[1,10])'

其中l最大的单字符 ( s)文件和子目录 ( ) 按大小排序。10 L?/tmp**/S

当您只需要 10 个最大的文件时,使用perl, 和 可以避免将整个文件列表存储在内存中:

perl -MFile::Find -e '
  find(
    sub {
      if (length == 1 && $_ ne ".") {
        @s = sort {$b->[0] <=> $a->[0]} [-s, $File::Find::name], @s;
        splice @s, 10
      }
    }, "/tmp"
  ); printf "%16d %s\n", @{$_} for @s'

(就像您建议的length == 1 && $_ ne "."那样匹配单字节文件名)。/tmp/?

相反printf "%16d %s\n", @{$_},您也可以像解决方案ls中那样运行zshexec "ls", "-ldS", map $_->[1], @s

答案4

我想说用 bash 更容易

find ${PATH_TO_PARENT_FOLDER} -type f -exec du -ahx {} + | sort -rh | head -10

本质上我们用来find定位文件夹内的所有文件,

  • -type对于f文件或d目录
  • -exec使用 find 的输出执行命令并将 find 结果作为参数放在{}

然后执行dufind和add计算找到的每个元素的大小

  • -a, --all 所有文件的写入计数,而不仅仅是目录
  • -h, --human-readable 采用人类可读格式的打印尺寸(例如,1K 234M 2G)
  • -x, --one-file-system 跳过不同文件系统上的目录

然后我们通过管道将其从大到小排序,并使用 head 仅显示前 10 个

sort对输出结果进行排序

  • -h, --human-numeric-sort 比较人类可读的数字(例如,2K 1G)
  • -r, --reverse 反转比较结果

head只阅读最上面的结果

  • -<N>设置您想要查看的行数(从 1 到 N)

相关内容