디렉토리에서 최대 및 최소 파일 크기와 해당 경로를 찾는 방법

디렉토리에서 최대 및 최소 파일 크기와 해당 경로를 찾는 방법

최대, 최소, 평균 파일 크기와 해당 경로를 알고 싶습니다. 디렉터리에 유사한 파일(예: 15kb, 15kb)이 포함된 경우 두 파일의 경로와 파일 크기가 동시에 표시되어야 합니다. headand 명령을 사용하지 않고도 tail출력을 생성할 수 있습니다 . (이를 사용하면 tail -n 2마지막 두 줄이 생성되지만 대신 이를 수행할 수 있는 다른 대안이 있습니다. 예를 들어 디렉터리에는 동일한 크기의 파일 20개가 포함되어 있습니다(예: file1--10b, file2--10b...). ..file20--10b) tail -n 20명령을 사용하는 대신 동일한 크기의 20개 파일을 자동으로 가져오는 명령이 있습니까?

내 코드:

#!/bin/bash
dir=$1

if [ $# -ne 1 ]
then
    echo "please pass arguments" 
exit
fi

if [ -d $dir ]
then
    if [ -z "$(ls -1A -- $dir)" ]
      then
        echo " directory exists but its empty" 
        else
                printf "minimum file size: %s\n" 
                du $dir -hab | sort -n -r |tail -n 2
                 find "$dir" -type f -printf '%s %p\n' | sort -n -r | head -n 1 | {
                read -r size name
                printf "maximum file size: %d\n\t%s\n" "$size" "$name"
                }

                printf "average file size: %s"
                du $dir -sk | awk '{s+=$1}END{print s/NR}'
    fi
        else
        echo " directory doesn't exists"
fi

내 결과는 다음과 같습니다: $./filestats testdir

minimum file size:  
15  testdir/subdir3/subdir4/file3.txt
15  testdir/subdir1/file5.txt
maximum file size: 48
    testdir/file7.txt
average file size: 60

실제 출력은 다음과 같아야 합니다: $./filestats testdir

minimum file size: 15 
        testdir/subdir3/subdir4/file3.txt
        testdir/subdir1/file5.txt
    maximum file size: 48
        testdir/file7.txt
        testdir/file8.txt
    average file size: 60

답변1

GNU 시스템에서:

#! /bin/sh -
find "$1" -type f -printf '%s\0  %p\n\0' |
  awk -vRS='\0' '
    {getline file}
    {n++; sum += $0; files[$0] = files[$0] file}
    $0 < min || n == 1 {min = $0}
    $0 > max || n == 1 {max = $0}
    END {
      if (n)
        printf "min: %d\n%s\nmax: %d\n%s\naverage: %.17g\n", \
          min, files[min], max, files[max], sum/n
    }'

이것은 파일 크기입니다(여기정기적인-type f디스크 사용량이 아닌 )을 사용하는 파일만 해당됩니다 . 디스크 사용의 경우 s 인수를 사용 %k하거나 대체하십시오 %b.%sfind-printf

이 가정은 옵션이나 술어(예 : , , , ...) $1처럼 보이지 않습니다 .find-L!(-name

$ that-script /usr/bin
min: 30
  /usr/bin/rgrep
  /usr/bin/xlinks2

max: 11634832
  /usr/bin/doxygen

average: 170653.62570735652

답변2

나는 종종 쉘 스크립트가 약간 투박하다고 생각하므로 이를 수행하기 위해 Python 스크립트를 작성했습니다.

import os
import sys

dir = "."
if len(sys.argv) > 1:
  dir=sys.argv[1]

files = [os.path.join(f[0], x) for f in os.walk(dir) for x in f[2]]
filesWithSizes = [(f, os.stat(f).st_size) for f in files if os.path.exists(f)]

sizes = [f[1] for f in filesWithSizes]
maxSize = max(sizes)
minSize = min(sizes)
avgSize = 0
if len(sizes) > 0:
  avgSize = sum(sizes) / len(sizes)

maxFiles = [f[0] for f in filesWithSizes if f[1] == maxSize]
minFiles = [f[0] for f in filesWithSizes if f[1] == minSize]

print("Minimum file size: {}".format(minSize))
for f in minFiles:
  print("  " + f)
print("Maximum file size: {}".format(maxSize))
for f in maxFiles:
  print("  " + f)
print("Average file size: {}".format(avgSize))

관련 정보