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


78

폴더에서 가장 큰 파일을 찾아야합니다.
폴더를 재귀 적으로 스캔하고 내용을 크기별로 정렬하려면 어떻게합니까?

을 사용해 보았지만 ls -R -S디렉토리도 나열됩니다.
나는 또한 사용하려고했다 find.


1
각 서브 디렉토리의 파일을 개별적으로 나열 하시겠습니까, 또는 모든 서브 디렉토리에서 모든 파일을 찾고 파일의 서브 디렉토리에 상관없이 크기별로 나열 하시겠습니까? 또한 "디렉토리"와 "폴더"는 무엇을 의미합니까? 당신은 다른 것들을 설명하기 위해 그것들을 사용하는 것 같습니다.
terdon

하위 디렉토리 만 표시하지 않고 주어진 디렉토리의 파일과 하위 디렉토리의 파일을 나열하려고한다고 말씀하십니까? 질문을 정리하고 정리하십시오. 명확하지 않습니다.
slm

답변:


92

당신은 또한 이것을 그냥 할 수 있습니다 du. 안전한면에 있기 위해이 버전을 사용하고 있습니다 du.

$ du --version
du (GNU coreutils) 8.5

접근:

$ du -ah ..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

가장 작은 파일부터 가장 큰 파일의 목록을 원하지만 상위 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

14
grep -v "/$"부분은 디렉토리가 슬래시가 추가하지 않는 한, 당신이 기대하는 일을하지 않는 것. 누구나 결과에서 디렉토리를 제외하는 방법을 알고 있습니까?
Jan Warchoł

@JanekWarchol-사용중인 coreutils 버전은 무엇입니까?
slm

8.13에 있습니다. 그러나 어쨌든 대답의 출력에는 후행이 없습니다. /예를 들어 /home/saml/Downloads/audible디렉토리 인 것처럼 보이지만 슬래시가 없습니다. /home/saml/Downloads/슬래시 만 있지만, 아마도 initial 인수를 지정할 때 슬래시로 작성했기 때문일 수 있습니다 du.
Jan Warchoł

1
이것은 또한
더러움을

1
이것은 파일뿐만 아니라 디렉토리도 나열합니다 :(
Roman Gaufman

20

현재 디렉토리와 하위 디렉토리에서 모든 파일을 찾고 경로를 고려하지 않고 크기에 따라 나열하고 GNU와 함께 파일 이름에 줄 바꿈 문자가 포함되어 있지 않다고 가정하면 다음과 같이 find할 수 있습니다.

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

에서 man find는 GNU 시스템 :

   -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

불행히도 Mac에서 작동하지 않습니다, 보여줍니다 : 찾기 : -printf : 알 수없는 기본 또는 운영자
Roman Gaufman

@RomanGaufman 예, 그래서 대답은 GNU 찾기를 지정합니다 . Mac에 GNU 도구를 설치하면 작동합니다.
terdon

11

다음 명령을 시도하십시오 :

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

현재 디렉토리에서 가장 큰 20 개의 파일을 재귀 적으로 나열합니다.

참고 :이 옵션 -h에 대한이 sort설치할했습니다, 그래서 OSX / BSD에서 사용할 수 없습니다 sort에서 coreutils(예를 통해 brew) 및 로컬 빈 경로를 적용 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

3
완벽합니다. Mac에서 작동하며 디렉토리를 표시하지 않는 첫 번째 솔루션입니다. :)-감사합니다!
Roman Gaufman

얼마나 많은 행을 가진 파일 만 표시하는 필터> = X? (예 : X = 0)
매트릭스

7

그러면 모든 파일이 재귀 적으로 검색되고 크기별로 정렬됩니다. 모든 파일 크기를 kb로 인쇄하고 반올림하여 0KB 파일을 볼 수는 있지만 사용하기에 충분히 가까웠으며 OSX에서 작동합니다.

find . -type f -print0 | xargs -0 ls -la | awk '{print int($5/1000) " KB\t" $9}' | sort -n -r -k1


우분투 14.04에서도 일했습니다!
David Lam

여기에는 파일뿐만 아니라 디렉토리가 나열됩니다. (
Roman Gaufman

@RomanGaufman-피드백 주셔서 감사합니다! 내 테스트에서 find . -type f파일을 찾습니다 ... 재귀 적으로 작동합니다. 그렇습니다. 그러나 디렉토리 자체가 아니라 찾은 모든 파일을 나열합니다.
Brad Parks

Xargs는 1980 년대에 사용되었습니다. David Korn이 execplus를 소개 한 것은 1989 년 이래로 나쁜 생각입니다.
schily

5

를 사용하면 다음을 사용 zsh하여 가장 큰 파일을 찾을 수 있습니다 ( ls -l디스크 사용량이 아닌 출력 의 크기 열과 같은 겉보기 크기 측면에서 ).

ls -ld -- **/*(DOL[1])

가장 큰 6 가지 :

ls -ld -- **/*(DOL[1,6])

파일 크기별로 정렬하려면 ls-S옵션을 사용할 수 있습니다 . 일부 ls구현 에는 목록을 정렬하지 않는 -U옵션 도 있습니다 ls( zsh여기서 이미 크기별로 정렬되어 있으므로 ).


3

디렉토리를 건너 뛰는 Mac / Linux 용 간단한 솔루션 :

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

2

등가의 BSD또는 OSX

$ du -ah simpl | sort -dr | head -6

0

이것은 여러 가지 이유로 엄청나게 일반적인 요구 사항이며 (디렉토리에서 가장 최근 백업을 찾는 것을 좋아합니다) 놀랍게도 간단한 작업입니다.

find, xargs, stat, tail, awk 및 sort 유틸리티를 사용하는 Linux 솔루션을 제공하려고합니다.

대부분의 사람들은 고유 한 답변을 제공했지만 파일 이름을 올바르게 처리하기 때문에 내 것을 선호하며 유스 케이스를 쉽게 변경할 수 있습니다 (통계 수정 및 인수 정렬)

또한 Windows에서도이 기능을 사용할 수있게 해주는 Python 솔루션을 제공합니다.

리눅스 커맨드 라인 솔루션

디렉토리에서 파일 크기별로 정렬 된 전체 파일 목록 만 재귀 적으로 반환

find . -type f -print0 | xargs -0 -I{} stat -c '%s %n' {} | sort -n

이전과 동일하지만 이번에는 가장 큰 파일을 반환합니다.

# Each utility is split on a new line to help 
# visualize the concept of transforming our data in a stream
find . -type f -print0 | 
xargs -0 -I{} stat -c '%s %n' {} | 
sort -n | 
tail -n 1 |
awk '{print $2}'

동일한 정확한 패턴이지만 이제 가장 큰 파일 대신 최신 파일을 선택하십시오.

# (Notice only the first argument of stat changed for new functionality!)
find . -type f -print0 | xargs -0 -I{} stat -c '%Y %n' {} | 
sort -n | tail -n 1 | awk '{print $2}'

설명:

  1. find : 현재 디렉토리에서 모든 파일을 재귀 적으로 찾고 널 문자로 인쇄합니다.
  2. xargs : 표준 입력에서 제공된 인수를 사용하여 명령을 실행하는 유틸리티입니다. 모든 출력 줄에 대해 해당 파일에서 stat 유틸리티를 실행하려고합니다
  3. stat : Stat는 많은 유스 케이스를 가진 멋진 명령입니다. 첫 번째 열은 블록 크기 (% s)이고 두 번째 열은 파일 이름 (% n) 인 두 개의 열을 인쇄하고 있습니다.
  4. 정렬 : 숫자 스위치로 결과를 정렬합니다. 첫 번째 인수는 정수이므로 결과가 올바르게 정렬됩니다
  5. tail : 출력의 마지막 줄만 선택하십시오 (목록이 정렬되어 있기 때문에 이것이 가장 큰 파일입니다).
  6. awk : 파일 이름을 포함하고 재귀 디렉토리에서 가장 큰 파일 인 두 번째 열을 선택하십시오.

파이썬 솔루션

#!/usr/bin/env python
import os, sys
files = list()
for dirpath, dirname, filenames in os.walk(sys.argv[1]):
    for filename in filenames:
        realpath = os.path.join(dirpath, filename)
        files.append(realpath)
files_sorted_by_size = sorted(files, key = lambda x: os.stat(x).st_size)
largest_file = files_sorted_by_size[-1]
print(largest_file)

이 스크립트는 설명하는 데 시간이 조금 더 걸리지 만 기본적으로 스크립트로 저장하면 명령 줄에 제공된 첫 번째 인수를 검색하여 해당 디렉토리에서 가장 큰 파일을 반환합니다. 스크립트는 오류 검사를하지 않지만 파이썬에서이 문제에 접근하는 방법에 대한 아이디어를 제공해야합니다.이 문제를 해결하는 데 플랫폼 독립적 인 방법이 있습니다.



0

정렬 옵션으로 아래 명령을 사용하여 크기가 폴더를 오름차순으로 만드십시오.

du -sh * | sort -sh


-1

AIX 및 HP-UX를 제외한 모든 플랫폼에서 작동하는 것은 다음과 같습니다.

find . -ls | sort +6 | tail
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.