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까지 설정하세요.

관련 정보