我需要修改以下 perl 命令:
perl -wE 'say for ((sort { -s $b <=> -s $a } </tmp/?>)[0..9]);'
要求:
- 它应该扫描目标目录内的所有子目录。
- 列出前 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
,请返回大小并使用 externalsort
和head
来限制输出:
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
中那样运行zsh
exec "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 结果作为参数放在{}
然后执行du
find和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)