우리는 4TB 크기의 공유를 호스팅합니다. 최대 크기의 파일을 찾는 것이 얼마나 효율적입니까?
일반적으로 다음을 사용합니다.
du -ak | sort -k1 -bn | tail -1
이렇게 큰 공유를 스캔한 후 다시 정렬하는 것은 쉽지 않습니다.
공유에서 가장 큰 파일만 이해하기 위한 제안 사항입니다.
또한 du -ak
현재 디렉터리의 크기도 반환합니다(예: ".123455"). 이것을 어떻게 피할 수 있습니까?
답변1
가장 큰 파일을 결정하기 위해 관련 디렉터리 트리를 스캔하여 파일 크기를 수집하는 것 외에 다른 방법은 없습니다. 크기 임계값이 존재한다는 것을 알고 있는 경우 find에 이 임계값 크기 미만의 파일을 무시하도록 지시할 수 있습니다.
$ find . -type f -size +50M ....
50MB보다 작은 파일은 무시됩니다. 파일이 항상 특정 위치에 있다는 것을 알고 있는 경우 find
전체 디스크를 검사하는 대신 해당 영역을 대상으로 파일을 지정할 수 있습니다.
노트:/var
일반적으로 형식이 지정되지 않은 디렉터리에 임의의 파일을 가져오면 안 되기 때문에 이것이 제가 일반적으로 사용하는 방법입니다 .
du
스위치를 사용하여 사람이 읽을 수 있는 형식으로 치수를 출력하도록 지시할 수 있습니다 -h
. 또한 이 sort
명령은 스위치를 사용하여 정렬하는 방법도 알고 있습니다 -h
.
예
$ find /home/saml/apps -type f -size +50M -print0 | \
du -h --files0-from=- | sort -h | tail -1
1.4G /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin
위의 코드는 null() 문자를 구분 기호로 사용하여 find
50MB보다 큰 파일 목록을 반환합니다 . \0
명령 du
은 이 목록을 사용하고 --files0-from=-
스위치를 사용하여 Null 값을 분할하는 방법을 알고 있습니다. 그런 다음 이 출력은 인위적으로 형식화된 크기에 따라 정렬됩니다.
아니요 tail -1
:
$ find /home/saml/apps -type f -size +50M -print0 | \
du -h --files0-from=- | sort -h
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
55M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtXmlPatternsMLAB.so.4.6.2.debug
56M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/ThirdParty/lib/libitkvnl-4.0_d.a
66M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkAccessories_d.so
79M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkMLConverters_d.so
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/lib/libQtGuiMLAB.so.4.6.2.debug
94M /home/saml/apps/MeVisLabSDK/Packages/MeVis/ThirdParty/Sources/Qt4/qt/lib/libQtGuiMLAB.so.4.6.2.debug
112M /home/saml/apps/ParaView-3.14.1-Linux-64bit.tar.gz
204M /home/saml/apps/Slicer-4.1.1-linux-amd64.tar.gz
283M /home/saml/apps/MeVisLabSDK/Packages/FMEwork/Release/lib/libMLDcmtkIODWrappers_d.so
1.4G /home/saml/apps/MeVisLabSDK2.2.1_gcc-64.bin
답변2
가장 큰 파일을 찾으려면 전체 디렉터리 트리를 살펴보고 각 파일의 크기를 확인해야 합니다.
zsh에서는 파일을 크기별로 정렬하는 쉬운 방법이 있습니다.o
글로벌 예선:
print -rl -- **/*(D.oL)
가장 큰 파일만 보려면:
echo **/*(D.oL[-1])
가장 큰 파일 10개를 보려면:
print -rl -- **/*(D.oL[-10,-1])
ls -S
크기별로 파일 정렬을 사용할 수도 있습니다 . 예를 들어, 다음은 가장 큰 파일 상위 10개를 보여줍니다. bash에서는 shopt -s globstar
재귀 와일드카드를 활성화하려면 먼저 실행 해야 합니다 **
. ksh93에서는 set -o globstar
먼저 실행하고, zsh에서는 즉시 사용할 수 있습니다. 이 방법은 파일 이름의 총 길이가 명령줄 제한을 초과할 정도로 파일이 많지 않은 경우에만 작동합니다.
ls -Sd **/* | head -n 10
대용량 파일이 많은 경우 정보 수집에 오랜 시간이 걸릴 수 있으므로 파일 시스템을 한 번만 탐색하고 출력을 텍스트 파일에 저장해야 합니다. 단일 파일에 관심이 있으므로 ; 외에 -S
GNU 옵션을 사용할 수 있습니다. 이렇게 하면 디렉터리 표시에 하위 디렉터리에 있는 파일의 크기가 포함되지 않고 해당 디렉터리에 직접 있는 파일만 포함되므로 소음이 줄어듭니다.du
-a
du -Sak >du
sort -k1n du | head -n 2
파일 크기만 필요한 경우 GNU 찾기 -printf
작업을 사용할 수 있습니다.
find -type f -printf '%s\t%P\n' | sort -k1n >file-sizes.txt
tail file-sizes.txt
파일 이름에 개행 문자가 포함되어 있으면 자동 처리가 중단됩니다. 대부분의 GNU 유틸리티에는 null 바이트(파일 이름에 나타날 수 없음)를 사용하는 방법이 있습니다(예: du -0
, sort -z
등 \0
) \n
.