디렉터리 파일 정보를 얻는 방법

디렉터리 파일 정보를 얻는 방법

특정 디렉터리에 대한 정보를 얻어야 하는데, 기본적으로 소형, 중형, 대형 파일 간의 상관 관계를 알아야 합니다.

나는 이것을 생각해 냈습니다 :

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별로 그룹화 하거나 결과를 예쁘게 인쇄합니다. 그것은 다음과 같습니다:uniqawksed

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

관련 정보