파일 시스템에서 가장 큰 파일을 찾기 위해 find + awk를 사용할 수 없는 이유는 무엇입니까?

파일 시스템에서 가장 큰 파일을 찾기 위해 find + awk를 사용할 수 없는 이유는 무엇입니까?

왜 이것이 작동하지 않습니까?
find / -ls 2>/dev/null | awk '$7 > max {max = $7}; END {print max}'
이것은 작동합니다:
find / -printf "%s\n" 2>/dev/null | sort -nr |head -n1

첫 번째는 7달러가 파일 크기인데 왜 안되는지 모르겠네요.

답변1

출력에서 일곱 번째 필드의 크기를 얻을 수 없습니다.find / -ls

  • 장치 파일의 경우 장치 주요 번호를 얻을 수 있습니다.
  • 사용자 이름 또는 그룹 이름에 공백 문자가 포함된 경우
  • 파일 경로(심볼릭 링크의 대상 포함)에 개행 문자가 있는 경우.

또한 이러한 파일 중 일부는 가상일 수도 있습니다. 예를 들어 /proc/kcore내 시스템에는 시스템의 가상 메모리 주소 공간인 128TiB가 있습니다.

또한 겉보기 크기는 디스크 사용량과 동일하지 않습니다. truncate -s15T file예를 들어 디스크 공간을 차지하지 않는 15TiB 스파스 파일을 생성합니다. %b가장 많은 디스크 공간을 차지하는 파일을 찾으려면 이 옵션을 사용하십시오.

귀하가 받게 될 연락은 이러한 방법에 따라 달라질 수 있습니다.

find / -xdev -printf '%b %p\0' 2> /dev/null |
  sort -zk1rn | head -zn1 | tr '\0' '\n'

(가장 무겁고 어휘 순서에서 첫 번째인 경우)

또는:

find / -xdev -printf '%b %p\0' 2> /dev/null|
  awk -v max=-1 -v RS='\0' '
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

(가장 무거움, 동점일 경우 무작위).

디스크 사용량은 512바이트 단위로 표시됩니다. 읽기 또는 검색 권한이 없는 디렉터리의 파일은 고려되지 않습니다.

-xdev검색을 하나의 파일 시스템(이 경우 루트 파일 시스템)으로 제한합니다.

-printf이것은 -zGNU 확장이라는 점에 유의하십시오 . -v RS='\0'또한 비표준입니다.

모든 연락처 신고(특정 순서 없음):

find / -xdev -printf '%b %p\0' 2> /dev/null |
  awk -v max=-1 -v RS='\0' '
    $1 == max {out = out ORS $0; next}
    $1 > max {max = $1; out = $0}
    END {if (max >= 0) print out}'

답변2

이상한. 그러나 나는 이것이 작동하도록 했습니다:

sudo find /boot -ls | awk '$7 > max {name = $11 ; max = $7}; END {print name" "max}'

관련 정보