크기가 현재 디렉터리의 평균 파일 크기보다 크거나 같은 모든 파일과 디렉터리를 찾는 방법은 무엇입니까?
답변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