각 디렉토리에서 가장 큰 파일을 재귀적으로 찾고 싶습니다.

각 디렉토리에서 가장 큰 파일을 재귀적으로 찾고 싶습니다.

출력에는 디렉터리 이름, 파일 이름 및 파일 크기가 포함됩니다. 명령이 실행되는 각 디렉터리에 대해 하나(가장 큰 파일)입니다.

가능하다면 해당 디렉토리에 있는 파일의 평균 크기도 마찬가지입니다.

목적은 디렉터리의 다른 파일보다 훨씬 큰 파일을 찾는 디렉터리를 교체할 수 있도록 하는 것입니다.

답변1

GNU 및 (4.2.2 이상)을 사용하면 find파일 크기를 기준으로 한 번 정렬하고 디렉터리 경로를 기준으로 다시 정렬합니다 sort.sed

find /some/dir -type f -printf '%s %f%h\0' | 
  sort -zrn |
  sort -zut/ -k2 |
  sed -zre 's: ([^/]*)(/.*): \2/\1:'

설명:

  • 파일 크기, 이름 및 경로가 인쇄되며(첫 번째는 공백으로 구분되고 다음 두 개는 로 구분됨 /) 각 항목은 ASCII NUL 문자로 종료됩니다.
  • 그런 다음 NUL로 구분된 출력을 가정하고 크기를 사용하여 숫자로 정렬합니다(역순으로 가장 큰 파일이 먼저 표시됨).
  • 그런 다음 파일이 포함된 디렉터리의 경로가 되는 sort두 번째로 구분된 필드의 모든 항목을 사용하여 첫 번째 고유 항목만 인쇄 합니다./
  • 그런 다음 sed디렉터리와 파일 이름을 바꿔서 일반 경로를 얻습니다.

읽을 수 있는 출력을 위해 ASCII NUL을 줄 바꿈으로 바꾸십시오.

find /some/dir -type f -printf '%s %f%h\0' | 
  sort -zrn |
  sort -zut/ -k2 |
  sed -zre 's: ([^/]*)(/.*): \2/\1:' |
  tr '\0' '\n'

예제 출력:

$ find /var/log -type f -printf '%s %f%h\0' | sort -zrn | sort -zt/ -uk2 | sed -zre 's: ([^/]*)(/.*): \2/\1:' | tr '\0' '\n'
3090885 /var/log/syslog.1
39789 /var/log/apt/term.log
3968 /var/log/cups/access_log.1
31 /var/log/fsck/checkroot
467020 /var/log/installer/initial-status.gz
44636 /var/log/lightdm/seat0-greeter.log
15149 /var/log/lxd/lxd.log
4932 /var/log/snort/snort.log
3232 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log

답변2

평균을 결합 find하고 awk계산할 수도 있습니다.

find . -type f -printf '%s %h/%f\0'|awk 'BEGIN { RS="\0" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'

보다 읽기 쉬운 방식으로 구성된 AWK 스크립트는 다음과 같습니다.

BEGIN { RS="\0" }

{
  SIZE=$1
  for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
  NF = NF - 1
  DIR=$0
  gsub("/[^/]+$", "", DIR)
  FILE=substr($0, length(DIR) + 2)
  SUMSIZES[DIR] += SIZE
  NBFILES[DIR]++
  if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
    MAXSIZE[DIR] = SIZE
    BIGGESTFILE[DIR] = FILE
  }
}

END {
  for (DIR in SUMSIZES) {
    printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
  }
}

이것은 null로 구분된 입력 레코드를 예상합니다. (저는 이것을 훔쳤습니다.무루의 대답); 각 입력 레코드에 대해

  • 나중에 사용하기 위해 크기를 저장합니다.
  • 경로의 첫 번째 문자 앞의 모든 항목을 제거합니다(그래서 최소한 공백이 있는 파일 이름을 올바르게 처리합니다).
  • 디렉토리를 추출하고,
  • 파일 이름을 추출하고,
  • 이전에 저장한 크기를 디렉터리의 크기 합계에 더합니다.
  • 디렉토리의 파일 수를 증가시킵니다(평균을 계산할 수 있도록).
  • 크기가 디렉터리에 대해 저장된 최대 크기보다 크거나 디렉터리에 아직 파일이 표시되지 않은 경우 가장 큰 파일에 대한 정보를 업데이트합니다.

모든 작업이 완료되면 스크립트는 키를 반복하여 SUMSIZES디렉터리, 평균 크기, 가장 큰 파일 이름 및 크기를 출력합니다.

출력을 파이프로 연결하여 sort디렉터리 이름별로 정렬할 수 있습니다. 인간 친화적인 형식으로 크기의 형식을 추가로 지정하려면 행을 printf다음과 같이 변경할 수 있습니다.

printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]

그런 다음 출력을 numfmt --field=1,2 --to=iec. 여전히 디렉터리 이름을 기준으로 결과를 정렬할 수 있습니다. 세 번째 필드부터 정렬하면 됩니다 sort -k3.

답변3

Zsh'에스와일드카드 패턴당신이 하고 있는 일에 매우 유용할 것입니다. 특히 zsh는 다음을 통해 유형, 크기 등과 같은 속성을 기준으로 파일을 일치시킬 수 있습니다.글로벌 한정자. Glob 한정자를 사용하면 일치 항목을 정렬할 수도 있습니다.

예를 들어 zsh에서는 *(.DOLN[1])현재 디렉터리에서 가장 큰 파일의 이름으로 확장됩니다. *파일 이름의 패턴입니다(셸 옵션에 따라 점 파일을 제외하고 모든 항목과 일치). 한정자는 .일치 항목을 일반 파일로 제한하고, 도트 파일을 포함하고, D작은 크기("길이")로 정렬하고, 일치하는 파일이 전혀 없으면 확장을 비우고, 첫 번째 일치 항목만 선택합니다.*OLN[1]

를 사용하여 디렉토리를 재귀적으로 열거할 수 있습니다 **/. 예를 들어 다음 루프는 현재 디렉터리와 해당 하위 디렉터리의 모든 하위 디렉터리를 반복적으로 반복합니다.

for d in **/*(/); do … done

당신이 사용할 수있는zstat구문 분석을 위해 다른 도구에 의존하지 않고도 파일 크기 및 기타 메타데이터에 액세스할 수 있습니다.

zmodload -F zsh/stat b:zstat
files=(*(DNoL))
zstat -A sizes +size -- $files
total=0; for s in $sizes; do total+=$s; done
if ((#sizes > 0)); then
  max=$sizes[-1]
  average=$((total/#sizes))
  median=$sizes[$((#sizes/2))]
fi

답변4

Baobab이나 유사한 소프트웨어를 사용해 보십시오. 그 중 하나 이상이 배포판에 포함될 가능성이 높습니다. 그들은 문제 디렉토리를 매우 잘 시각화합니다.

  • 바오밥
  • JDisk보고서
  • NCDU
  • K4DirStat
  • QDirStat
  • GD 지도

http://alternativeto.net/software/baobab/?platform=linux

그리고 Baobab의 매뉴얼 페이지는 그것이 어떻게 이루어지는지 알려줍니다.

$> man baobab
BAOBAB(1)

NAME
       Baobab - A graphical tool to analyse disk usage

SYNOPSIS
       baobab  [directory]

DESCRIPTION
       baobab is able to scan either specific folders or the whole filesys-
       tem (local and remote), in order to give the user a graphical tree
       representation including each directory size or percentage in the
       branch.  It also auto-detects in real-time any change made to your
       home directory as far as any mounted/unmounted device. A graphical
       treemap window is also provided for any selected folder.

       A detailed documentation on the program could be read at:
       http://www.gnome.org/projects/baobab

AUTHOR
       Fabio MARZOCCA <[email protected]>



                                                                     BAOBAB(1)

관련 정보