크기에 따라 파일을 재귀적으로 정렬

크기에 따라 파일을 재귀적으로 정렬

폴더에서 가장 큰 파일을 찾아야 합니다.
폴더를 재귀적으로 스캔하고 내용을 크기별로 정렬하는 방법은 무엇입니까?

을 사용해 보았지만 ls -R -S여기에도 디렉토리가 나열되어 있습니다.
을 사용해 보기도 했습니다 find.

답변1

를 사용하여 이 작업을 수행할 수도 있습니다 du. 안전을 위해 다음 버전을 사용합니다 du.

$ du --version
du (GNU coreutils) 8.5

이 방법:

$ du -ah <some DIR> | grep -v "/$" | sort -rh

방법 분해

이 명령은 du -ah DIR주어진 디렉토리에 있는 모든 파일과 디렉토리의 목록을 생성합니다 DIR. 이렇게 하면 -h내가 선호하는 사람이 읽을 수 있는 크기가 생성됩니다. 원하지 않으면 스위치를 제거하세요. 나는 head -6단지 출력을 제한하기 위해 사용하고 있습니다!

$ du -ah ~/Downloads/ | head -6
4.4M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020_WirelessFrames_exUG_GLB_en.pdf
624K    /home/saml/Downloads/kodak_W820_wireless_frame/easyshare_w820.pdf
4.9M    /home/saml/Downloads/kodak_W820_wireless_frame/W820_W1020WirelessFrameExUG_GLB_en.pdf
9.8M    /home/saml/Downloads/kodak_W820_wireless_frame
8.0K    /home/saml/Downloads/bugs.xls
604K    /home/saml/Downloads/netgear_gs724t/GS7xxT_HIG_5Jan10.pdf

가장 작은 것부터 가장 큰 것까지 정렬하는 것은 쉽습니다.

$ du -ah ~/Downloads/ | sort -h | head -6
0   /home/saml/Downloads/apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios/plugins/check_ldaps
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/0/translog/translog-1365292480753
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/index/write.lock
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/1/translog/translog-1365292480946
0   /home/saml/Downloads/data/elasticsearch/nodes/0/indices/logstash-2013.04.06/2/index/write.lock

가장 큰 것부터 가장 작은 것 순으로 뒤집으세요.

$ du -ah ~/Downloads/ | sort -rh | head -6
10G /home/saml/Downloads/
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy

디렉터리를 표시하지 않고 파일만 표시합니다.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -rh | head -6 
3.8G    /home/saml/Downloads/audible/audio_books
3.8G    /home/saml/Downloads/audible
2.3G    /home/saml/Downloads/apps_archive
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
1.5G    /home/saml/Downloads/digital_blasphemy
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

제외하고 싶다면모든 디렉토리출력에서 기존 점 문자의 트릭을 사용할 수 있습니다. 이는 디렉터리 이름에 점이 포함되어 있지 않고 찾고 있는 파일에는 점이 포함되어 있다고 가정합니다. 그런 다음 다음을 사용하여 디렉터리를 필터링할 수 있습니다 grep -v '\s/[^.]*$'.

$ du -ah ~/Downloads/ | grep -v '\s/[^.]*$' | sort -rh | head -2
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run

가장 작은 것부터 가장 큰 것 순으로 목록을 원하지만 문제의 처음 6개 파일이 필요한 경우 정렬 스위치를 반전하고 삭제( -r)한 다음 tail -6를 사용할 수 있습니다 head -6.

$ du -ah ~/Downloads/ | grep -v "/$" | sort -h | tail -6
835M    /home/saml/Downloads/apps_archive/cad_cam_cae/salome/Salome-V6_5_0-LGPL-x86_64.run
1.5G    /home/saml/Downloads/digital_blasphemy
1.5G    /home/saml/Downloads/digital_blasphemy/db1440ppng.zip
2.3G    /home/saml/Downloads/apps_archive
3.8G    /home/saml/Downloads/audible
3.8G    /home/saml/Downloads/audible/audio_books

답변2

현재 디렉터리와 그 하위 디렉터리에 있는 모든 파일을 찾고 크기에 따라(경로에 관계없이) 나열하고 모든 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하고 GNU를 사용하면 find다음과 같이 할 수 있습니다.

find . -type f -printf "%s\t%p\n" | sort -n

man findGNU 시스템 에서 :

   -printf format
          True; print format  on  the  standard  output,
          interpreting  `\'  escapes and `%' directives.
          Field widths and precisions can  be  specified
          as  with the `printf' C function.  Please note
          that many of the  fields  are  printed  as  %s
          rather  than  %d, and this may mean that flags
          don't work as you  might  expect.   This  also
          means  that  the `-' flag does work (it forces
          fields to be  left-aligned).   Unlike  -print,
          -printf  does  not add a newline at the end of
          the string.  The escapes and directives are:

          %p     File's name.
          %s     File's size in bytes.

에서 man sort:

   -n, --numeric-sort
          compare according to string numerical value

답변3

다음 명령을 시도해 보십시오:

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

현재 디렉터리에서 가장 큰 파일 상위 20개를 반복적으로 나열합니다.

-h참고: OSX/BSD에서는 이 옵션을 sort사용할 수 없으므로 sort에서 설치하고 coreutils(예: 를 통해 brew) 로컬 bin 경로를 에 적용 해야 합니다 PATH.

export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH" # Add a "gnubin" for coreutils.

또는 다음을 사용하십시오:

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

가장 큰 디렉터리의 경우 를 사용합니다 du. 예를 들면 다음과 같습니다.

du -ah . | sort -rh | head -20

또는:

du -a . | sort -rn | head -20

답변4

Mac/Linux용 디렉터리 건너뛰기를 위한 간단한 솔루션:

find . -type f -exec du -h {} \; | sort -h

관련 정보