파일이 평균 디렉토리 크기보다 큽니까?

파일이 평균 디렉토리 크기보다 큽니까?

크기가 현재 디렉터리의 평균 파일 크기보다 크거나 같은 모든 파일과 디렉터리를 찾는 방법은 무엇입니까?

답변1

avg_size=$(find . -maxdepth 1 -type f -printf %s\\n | 
  { sum=0; files=0; while read size; do sum=$((sum+size)); ((files++)); done; echo "$((sum/files))"; })
echo "average file size: ${avg_size}"
find . -maxdepth 1 -type f -size +"$avg_size"c

답변2

GNU 도구가 있는 경우:

find -maxdepth 1 -type f -printf '%s %p\0' | 
  awk -v RS='\0' '{a[$0]=$1;s+=$1;}
                  END{m=s/NR; for(i in a){if(a[i]>=m){print i}}}' 

그렇지 않은 경우:

perl -le 'opendir(D,"."); @F=readdir(D); @files=grep{-f $_}@F; 
    for (@files){$s= -s $_; $t+=$s; $f{$_}=$s} 
    print join "\n",grep{$f{$_}>=$t/scalar(@files)}@files' 

다음으로 확장 가능:

#!/usr/bin/perl 

## Open the current directory as D
opendir(D,".");
## Read the contents of D into @F
@F=readdir(D);
## Collect only the files, no dirs etc. 
@files=grep{-f $_}@F;
## For each file, as $_
for (@files){
    ## Get the size
    $s= -s $_;
    ## Add the size to the total
    $t+=$s;
    ## Save the size in the hash %f whose keys are the file names
    $f{$_}=$s
}
## Get all files whose size is greater than the average
my @wanted=grep{$f{$_}>=$t/scalar(@files)}@files;
## Print the elements of the array @wanted with a newline after each of them
print join "\n", @wanted ;
print "\n";

답변3

다음은 bash 관련 솔루션입니다. 파일을 반복하고 크기와 이름을 색인화된 bash 배열로 수집한 다음 평균을 계산하고 다시 배열로 반복하여 (정수) 평균보다 큰 파일만 인쇄합니다. 사이즈 이름.

#!/bin/bash

declare -i sum=0
declare -i nfiles=0
declare -a filenames
declare -a filesizes

for file in *
do
  [ -f "$file" ] || continue
  size=$(stat -c %s -- "$file")
  filenames[$nfiles]="$file"
  filesizes[$nfiles]=$size
  sum+=$size
  nfiles+=1
done

[ $nfiles -eq 0 ] && exit

avg=$(( sum / nfiles ))

for((index=0; index < ${#filenames[*]}; ++index))
do
  [ ${filesizes[$index]} -gt $avg ] && printf "%s\n" "${filenames[$index]}"
done

답변4

#!/bin/bash
no=$(ls -l | wc -l)
find_files(){
    if [ $(ls -l | awk '{print $5}' | awk 'FNR=='$1'') -ge $2 ]
    then
        echo $(ls -l | awk '{print $9}' | awk 'FNR=='$1'')
    fi
}

average(){
    local   count=2
    sum=0
    while [ $count -le $no  ]
    do
        let sum=sum+$(ls -l | awk '{print $5}' | awk 'FNR=='$count'')

        ((count++))
    done
    let num=$no-1
    let avg=$sum/$num
    echo $avg
}
main(){
    a=$(average)
    i=2
    while [ $i -le $no ]
    do
        find_files $i $a
        ((i++))
    d

}

main

관련 정보