Perlコマンドを変更する必要があります。

Perlコマンドを変更する必要があります。

次の perl コマンドを変更する必要があります。

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

必要:

  1. ターゲットディレクトリ内のすべてのサブディレクトリを検索する必要があります。
  2. サイズとパスで最初の10個のファイルを一覧表示します。

答え1

File::FindこのPerlスクリプトは、再帰巡回に必要なものを正確に印刷します。私は-fファイルだけがハッシュにプッシュされたことを確認しました。

ハッシュにはキーと値が%filesあります。次に値でソートし、上位10件の結果を印刷します。filepathsize

#!/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実行することもできます。zshexec "ls", "-ldS", map $_->[1], @s

答え4

bashを使うともっと簡単だと言いたいです。

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

デフォルトでは、findフォルダー内のすべてのファイルを検索するために使用します。

  • -typefファイルまたはdディレクトリの場合
  • -execfindの出力を使用してコマンドを実行し、検索結果を引数として入力します。{}

次に、検索と追加を実行して、見つかった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まで設定します。

関連情報