특정 디렉터리에 대한 정보를 얻어야 하는데, 기본적으로 소형, 중형, 대형 파일 간의 상관 관계를 알아야 합니다.
나는 이것을 생각해 냈습니다 :
for i in K M G; do
printf $i
du -h /usr/opt |
awk '{print $1}' |
grep ${i}$ |
wc -l
done | tee /stat.out
그런 다음 결과에 따라 모든 숫자를 더하고 총계를 빼서 1k 미만의 파일 수를 얻습니다. (소스 파일이라 많이 있는 것 같아요)
어쨌든 이 방법은 작은 디렉터리에 유용합니다. 실제로 매우 큰 디렉터리(1Tera가 넘을 것으로 예상)를 가지고 있고 파일 배포를 모릅니다. 이 모든 파일을 개인 저장소에 복사해야 하며 복사하는 데 걸리는 예상 시간을 제공해야 합니다.
나는 다음과 같이 할 생각입니다 :
find pwd |xargs ls -lph |awk '{print $5}'
하지만 무엇을 넣어야 할지, 아니면 다른 접근 방식을 취해야 할지 모르겠습니다.
답변1
GNU find(내장되지 않은 Linux 또는 Cygwin)에 액세스할 수 있는 경우 find
파일 크기를 인쇄하고 출력을 사후 처리하여 awk
각 크기를 범주별로 정렬하고 범주 sort
별로 그룹화 하거나 결과를 예쁘게 인쇄합니다. 그것은 다음과 같습니다:uniq
awk
sed
find /usr/opt -type f -printf '%s\n' |
awk '{
if ($1 ~ /^[2-9]......../) { print "3 G" }
else if ($1 >= 1073741824) { print "3 G" }
else if ($1 >= 1048576) { print "2 M" }
else if ($1 >= 1024) { print "1 k" }
else if ($1 >= 1) { print "0" }
}' |
sort | uniq -c |
awk '{print $1 " files are in the " $3 "B range"}'
답변2
내가 생각해낸 최고의 해결책은 awk 스크립트를 사용하는 것이었습니다.
{
if ( substr( $5, length($5), length($5) ) == "K" ) {
totK++;
totKsize = totKsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "M" ) {
totM++;
totMsize = totMsize + substr($5, 0, length($5) - 1 );}
else if ( substr( $5, length($5), length($5) ) == "G" ) {
totG++;
totGsize = totGsize + substr($5, 0, length($5) - 1 );}
else {
totB++;
totBsize=totBsize + $5; }
}
END{
print "NR of files less than 1k => " totB " total " totBsize;
print "NR of files less than 1M => " totK " total " totKsize;
print "NR of files less than 1G => " totM " total " totMsize;
print "NR of files bigger than 1G => " totG " total " totGsize;
}
다음과 같이 패스를 수행합니다.
find . -type f |xargs ls -lh |/usr/xpg4/bin/awk -f count_files.awk