次の perl コマンドを変更する必要があります。
perl -wE 'say for ((sort { -s $b <=> -s $a } </tmp/?>)[0..9]);'
必要:
- ターゲットディレクトリ内のすべてのサブディレクトリを検索する必要があります。
- サイズとパスで最初の10個のファイルを一覧表示します。
答え1
File::Find
このPerlスクリプトは、再帰巡回に必要なものを正確に印刷します。私は-f
ファイルだけがハッシュにプッシュされたことを確認しました。
ハッシュにはキーと値が%files
あります。次に値でソートし、上位10件の結果を印刷します。filepath
size
#!/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
サイズを返し、externalを使用してsort
出力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の出力を使用してコマンドを実行し、検索結果を引数として入力します。{}
次に、検索と追加を実行して、見つかったdu
各要素のサイズを計算します。
-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まで設定します。