디렉토리의 항목을 크기별로 나열하는 Bash 스크립트

디렉토리의 항목을 크기별로 나열하는 Bash 스크립트

각 매개변수에 대해 스크립트는 디렉토리에서 가장 큰 항목과 해당 크기를 표시해야 하는 스크립트를 작성하는 방법입니다. 이 같은:

[user]$ maxls /boot 2> /dev/null | sort -n
1024 /boot/grub2/themes/stars
8101 /boot/grub2/pic.png

답변1

#!/bin/sh
for dir
do
    [ -d "$dir" ] || continue
    du -hs "$dir"/* | sort -hr | sed  1q
done

답변2

사용하려면 perl다음과 같은 것을 선택합니다.

#!/usr/bin/env perl
use strict;
use warnings;

use File::Find;

my %biggest_file_in;
my %biggest_file_size_in;

sub max_in_path {
    my ($dir) = @_;
    return unless -f;
    if ( -s > ( $biggest_file_size_in{$dir} // 0 ) ) {

        $biggest_file_in{$dir}      = $File::Find::name;
        $biggest_file_size_in{$dir} = -s;
    }
}


my ($path_to_search) = @ARGV;
die "Specify a path" unless $path_to_search;
foreach my $dir ( glob("$path_to_search/*") ) {
    next unless -d $dir;
    find( sub { max_in_path($dir) }, $dir );
    print $dir, ":", $biggest_file_in{$dir}, " =>",
        $biggest_file_size_in{$dir}, "\n";
}


print "Largest files in individual directories (sorted):\n";
foreach my $dir ( sort 
                     { $biggest_file_size_in{$b} <=> $biggest_file_size_in{$a} } 
                         keys  %biggest_file_size_in ) { 
    print "$dir $biggest_file_in{$dir} $biggest_file_size_in{$dir}\n";
}

참고 - 지정된 디렉터리 아래의 모든 디렉터리에 적용됩니다. (예: myfind.pl /data검색 /data/*하지만 에 있는 파일은 무시합니다 /data.)

답변3

쉘에는 zsh이에 대한 지원이 내장되어 있습니다.

#! /bin/zsh -
zmodload zsh/stat &&
for dir {
  largest=(${dir:-.}/**/*(NDOL[1]))
  (($#largest)) || largest=${dir:-.}
  zstat -A size +size -- "$largest" &&
    print -r -- $size $largest
}

답변4

# m_all [dir=.]...: lists the biggest file in *all* the directories.
#   du options can be specified using $DU_OPTS; the recommend value is '-h'.
m_all(){ find "$@" -type f -print0 | du $DU_OPTS --files0-from=-; }
# maxls: for each argument, list the biggest $maxls_n items.
#   If $maxls_n is undefined or empty, use 1.
#   Additional arguments to pass to m_all can be defined in the array mallargs; see examples below.
maxls(){ local i; for i; do m_all "$i" "${mallargs[@]}" | sort -h | tail -n "${maxls_n:-1}"; done; }
#_Example:
# list the biggest file for /bin and /usr respectively
maxls /bin /usr
# list the biggest 5 files for /home and /root
maxls_n=5 maxls /home /root
# Let maxls count only *.avi, *.svg and *.mp4:
mallargs=(-iregex '.*\.\(avi\|svg\|mp4\).*')
# And run it against ~/Anime
maxls ~/Anime; mallagrs=() # clear that setting
# And use m_all to list the biggest five logs:
DU_OPTS=-h m_all /var -name '*.log*' | sort -h | tail -n 5

필터를 추가할 수도 있습니다 find!

편집하다: 각각 추가됩니다. 이 점을 지적해 주신 RobertL에게 감사드립니다. 그리고 문서.

이것을 스크립트 로 사용하려면 해당 파일이 포함된 새 파일을 만들고 #!/bin/bash이 줄을 복사한 (){다음 maxls "$@".~/bin


설명/변경 로그

예제에서 우리는 하위 디렉터리에 있는 파일을 볼 수 있으며 extra 를 사용합니다 sort -h. 전체 디렉터리가 그 안에 포함된 파일보다 확실히 작지 않기 때문에 결론을 내립니다.프로젝트파일만.

이 시점에서 나는 현재 이라고 불리는 원래 솔루션에 도달했습니다 m_all. 정렬하지 않으면 어느 것이 가장 큰지 알 수 없으므로 tail원래 예제에 추가 패스가 추가되었습니다.

약간의 수정 끝에 이것은 버전 3이지만 질문자가 원했기 때문에 문제가 있습니다.각 매개변수에 대해. 나는 이전 래퍼가 여전히 어느 정도 쓸모가 있다고 생각하고 변경 사항을 최소화하고 싶었기 때문에(v4) m_all라는 래퍼를 남겨두고 이름을 바꿨습니다 . maxls항상 그렇듯이 동작을 변경하기 위해 몇 가지 스위치를 남겨 두었습니다. 그 후 보시다시피 문서(v5-7)가 추가되었습니다.

주의하시기 바랍니다각각일반적으로 모든 작업이 완료된 후에 any 또는 를 사용하는 것은 tail의미가 없습니다 . 이러한 출력을 얻을 때마다 사용해야 합니다 sort. 주어진 각 파일의 마지막 몇 줄을 인쇄하지만 이로 인해 코드가 매우 길어집니다.sorttail

관련 정보