Bash에서 각 파일 및 디렉토리의 크기를 나열하고 내림차순으로 정렬하는 방법은 무엇입니까?


108

Bash에서 디렉토리 크기를 쉽게 얻을 수 없다는 것을 알았습니다.

를 입력 ls -<some options>하면 디렉토리의 파일 크기와 파일의 모든 합계를 동시에 나열하고 크기 순서로 정렬 할 수 있기를 바랍니다.

가능합니까?


2
디렉토리의 "크기"란 정확히 무엇을 의미합니까? 그 아래의 파일 수 (재귀 적 여부)? 그 아래에있는 파일 크기의 합계 (재귀 적이든 아니든)? 디렉토리 자체의 디스크 크기? (디렉토리는 파일 이름 및 기타 정보를 포함하는 특수 파일로 구현됩니다.)
Keith Thompson

재귀 적으로 아래에있는 파일 크기의 합계
Kit Ho

1
@Kit : 그렇다면 du답입니다.
Keith Thompson

@KeithThompson @KitHo du명령은 파일 공간 사용량을 추정하므로 정확한 크기를 얻으려는 경우 사용할 수 없습니다.
ztank1013 2011 년

@ ztank1013 : "정확한 크기"가 의미하는 바에 따라 du(적어도 GNU coreutils 버전) 정보를 제공하는 옵션이있을 수 있습니다.
Keith Thompson

답변:


218

디렉토리로 이동하여 다음 명령을 실행하십시오.

du -a --max-depth=1 | sort -n

또는 사람이 읽을 수있는 크기의 경우 -h를 추가하고 더 큰 디렉토리 / 파일을 먼저 인쇄하려면 -r을 추가하십시오.

du -a -h --max-depth=1 | sort -hr

23
du -h필요 sort -h을 보장하기 위하여,도 말의 981M종류 전에 1.3G; 와 sort -n숫자 만이 고려 될 것입니다 그리고 그들은 잘못된 방법 라운드 것.
Smylers 2013

여기에는 현재 디렉터리 내의 개별 파일 크기가 아니라 하위 디렉터리의 크기와 현재 디렉터리의 전체 크기 만 나열됩니다. OP의 질문에 답하기 위해 출력에 개별 파일을 어떻게 포함합니까?
Erik Trautman 2014

@ErikTrautman 당신이 추가 할 필요도 파일을 나열 -a하고 사용 --all대신 --max-depth=1과 같이du -a -h --all | sort -h
프랑코

대박! 나는 지금 몇 년 동안 뭔가 lamer를하고있다. :)
Colby Blair

6
sort -hGNU 버전 / Linux에서만 작동하며 BSD / OS X에서는 운이 없습니다.
djule5

20

분명히 --max-depth옵션은 Mac OS X 버전의 du명령 이 아닙니다 . 대신 다음을 사용할 수 있습니다.

du -h -d 1 | sort -n


분명히,하지만 놀랍지는 않습니다.
Josh Habdas

20
du -s -- * | sort -n

(숨겨진 (.dotfiles) 파일은 표시되지 않음)

du -smMb 단위 등에 사용 합니다. 항상 사용합니다.

du -smc -- * | sort -n

-c분명한 이유로 전체 줄 ( )이 맨 아래에 있기 때문입니다. :)

추신:

  • dotfile 처리에 대한 주석보기
  • 나는 자주 예를 들어 'du -smc / home / / | sort -n | tail '을 사용하여 큰 비트가 정확히 어디에 있는지 알 수 있습니다.

5
du --max-depth=1|sort -n또는 find . -mindepth 1 -maxdepth 1|xargs du -s|sort -ndotfile도 포함합니다.
Arnaud Le Blanc

@arnoud : 저도 사용하지만이 질문 (/ 답변)에 대한 올바른 추가가 아닌 것 같습니다. :)
sehe

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 du -s | sort -n발견 된 경로 중 일부에 공백이있을 수있는 경우 @ arnaud576875 .
Lri

1
사람이 읽을 수있는 가장 큰보기를 얻을 수있는 훌륭한 변형입니다.sudo du -smch * | sort -h | tail
marsbard

16

명령

du -h --max-depth=0 * | sort -hr

산출

3,5M    asdf.6000.gz
3,4M    asdf.4000.gz
3,2M    asdf.2000.gz
2,5M    xyz.PT.gz
136K    xyz.6000.gz
116K    xyz.6000p.gz
88K test.4000.gz
76K test.4000p.gz
44K test.2000.gz
8,0K    desc.common.tcl
8,0K    wer.2000p.gz
8,0K    wer.2000.gz
4,0K    ttree.3

설명

  • du "디스크 사용량"을 표시합니다.
  • h "사람이 읽을 수있는"(정렬 및 뒤 둘 다)
  • max-depth=0du하위 폴더의 크기를 표시하지 않음을 의미합니다 (모든 하위, 하위 하위, ..., 폴더에있는 모든 파일의 모든 크기를 표시하려면 제거)
  • r "reverse"(가장 큰 파일 먼저)

ncdu

이 질문에 대해 파일 시스템을 정리하고 싶었습니다. 명령 줄 도구 ncdu가이 작업에 더 적합합니다.

Ubuntu에 설치 :

$ sudo apt-get install ncdu

용법:

ncdu [path]명령 줄을 입력하기 만하면 됩니다. 경로를 분석하는 데 몇 초 후에 다음과 같은 내용이 표시됩니다.

$ ncdu 1.11 ~ Use the arrow keys to navigate, press ? for help
--- / ---------------------------------------------------------
.  96,1 GiB [##########] /home
.  17,7 GiB [#         ] /usr
.   4,5 GiB [          ] /var
    1,1 GiB [          ] /lib
  732,1 MiB [          ] /opt
. 275,6 MiB [          ] /boot
  198,0 MiB [          ] /storage
. 153,5 MiB [          ] /run
.  16,6 MiB [          ] /etc
   13,5 MiB [          ] /bin
   11,3 MiB [          ] /sbin
.   8,8 MiB [          ] /tmp
.   2,2 MiB [          ] /dev
!  16,0 KiB [          ] /lost+found
    8,0 KiB [          ] /media
    8,0 KiB [          ] /snap
    4,0 KiB [          ] /lib64
e   4,0 KiB [          ] /srv
!   4,0 KiB [          ] /root
e   4,0 KiB [          ] /mnt
e   4,0 KiB [          ] /cdrom
.   0,0   B [          ] /proc
.   0,0   B [          ] /sys
@   0,0   B [          ]  initrd.img.old
@   0,0   B [          ]  initrd.img
@   0,0   B [          ]  vmlinuz.old
@   0,0   B [          ]  vmlinuz

로 현재 강조 표시된 요소를 삭제하고 +로 d종료합니다.CTRLc


du -hs * | 정렬 -hr. -s (요약)는 --max-depth = 0과 동일합니다.
rasmusx

5

ls -S크기별로 정렬합니다. 그런 다음 크기도 표시하기 위해 크기 ls -lS( -l)별로 정렬 된 긴 ( -S) 표시를 제공합니다. 나는 일반적으로 -h내용을 더 쉽게 읽을 수 있도록 추가 하기 때문에 ls -lhS.


1
아, 죄송합니다. 게시물에서 명확하지 않습니다. 당신이 원하는 du것, 누군가를 기록했다. @sehe : 실제 정의에 따라 다릅니다. 디렉토리가 자체 저장에 사용하는 공간의 양을 보여줍니다. (하위 항목의 크기를 추가하는 것도 아닙니다.) 임의의 숫자가 아니며 항상 4KiB도 아닙니다.
Thanatos 2011 년

1

간단하고 빠름 :

find . -mindepth 1 -maxdepth 1 -type d | parallel du -s | sort -n

* GNU Parallel이 필요합니다 .


0

당신이 뭘하고 싶은지 알아 낸 것 같아요. 이것은 모든 파일과 모든 디렉토리의 정렬 된 목록을 제공하며, 파일 크기와 디렉토리 내용의 크기별로 정렬됩니다.

(find . -depth 1 -type f -exec ls -s {} \;; find . -depth 1 -type d -exec du -s {} \;) | sort -n

신경 쓰지 마세요, sehe는 훨씬 더 간단한 해결책을 제시했습니다. 나는 매일 새로운 것을 배웁니다!
dvorak

나는 사용 du이 옵션 이라고 생각하지 않으며 대략적인 결과를 줄 것입니다.
ztank1013

0

[향상된 버전] 아래
초기 버전 보다 훨씬 빠르고 정확하며 현재 디렉토리의 모든 파일 크기의 합계를 출력합니다.

echo `find . -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc

stat -c %s파일에 대한 명령은 크기를 바이트 단위로 반환합니다. tr여기에 있는 명령은 xargs명령 제한 을 극복하는 데 사용됩니다 (분명히 파이핑 xargs은 결과를 더 많은 행으로 분할하여 명령 논리를 깨는 것임). 따라서 tr줄 바꿈을 +(더하기) 기호 로 바꾸는 작업을 처리하고 있습니다. 평소와 같이 계산 을 수행하는 최종 (기본 계산기) 명령의 불평을 피하기 위해 결과 문자열에서 sed마지막 +기호 를 제거하는 유일한 목표가 bc있습니다.

성능 : 여러 디렉토리에서 테스트했으며 150.000 개 이상의 파일 상단 (내 fedora 15 상자의 현재 파일 수)에서 놀라운 결과를 얻었습니다.

# time echo `find / -type f -exec stat -c %s {} \; | tr '\n' '+' | sed 's/+$//g'` | bc
12671767700

real    2m19.164s
user    0m2.039s
sys 0m14.850s

du -sb /명령 과 비교하려는 경우 예상 디스크 사용량을 바이트 단위로 출력합니다 ( -b옵션).

# du -sb /
12684646920 /

예상대로 du유틸리티가 실제 사용 된 공간이 아닌 각 파일의 할당 된 공간을 반환 하기 때문에 내 명령 계산보다 약간 큽니다 .

[초기 버전] (맨 페이지 인용에 따라) 파일 공간 사용량을 추정 하기 때문에 폴더의 정확한 합계 크기를 알아야하는 경우 명령을
사용할 수 없습니다 . 따라서 잘못된 결과, 근사치 (합계 크기에 가깝지만 찾고있는 실제 크기보다 클 가능성이 높음)로 이어질 것입니다.dudu

귀하의 질문에 답변하는 방법이 다를 수 있다고 생각하지만 이것은 내 것입니다.

ls -l $(find . -type f | xargs) | cut -d" " -f5 | xargs | sed 's/\ /+/g'| bc

아래에있는 모든 파일을 찾습니다. 디렉토리 (원하는 디렉토리로. 변경), 숨겨진 파일도 포함되며 (를 사용하여 xargs) 한 줄에 이름을 출력 한 다음 ls -l. 이 (때때로) 거대한 출력은 cut 명령으로 파이프되고 다섯 번째 필드 ( -f5) ( 바이트 단위의 파일 크기) 만 가져 와서 다시 파이프 xargs되어 공백으로 구분 된 한 줄의 크기를 생성합니다. 이제 각 공백을 더하기 ( +) 기호로 바꾸고 마지막으로 bc(기본 계산기) 수학을 수행하는 sed 마법을 수행합니다 .

추가 조정이 필요할 수 있으며 ls너무 긴 인수 목록에 대해 불평하는 명령 이있을 수 있습니다 .


디렉토리가 너무 크면 오랫동안 전화를 끊고 홈 디렉토리에서 작업 해보십시오. : p
Kit Ho

@KitHo 글쎄, 나는 모든 파일을 검색하고 크기를 추가하지 않고 정확한 결과를 얻는 쉽고 빠른 방법이 없기 때문에 명령 게으름은 주로 검색 된 디렉토리 아래에 몇 개의 파일이 있는지에 달려 있습니다 ... 개선의 여지입니다 ... 좋은 도전입니다!
ztank1013

@KitHo 안녕하세요, 내 대답에서 향상된 버전 을 살펴보고 물론 알려주십시오!
ztank1013 2011 년

0

또 다른 간단한 해결책.

$ for entry in $(ls); do du -s "$entry"; done | sort -n

결과는 다음과 같습니다.

2900    tmp
6781    boot
8428    bin
24932   lib64
34436   sbin
90084   var
106676  etc
125216  lib
3313136 usr
4828700 opt

"du -s"를 "du -sh"로 변경하면 사람이 읽을 수있는 크기가 표시되지만이 방법에서는 정렬 할 수 없습니다.


0

아래를 사용하여 파일을 크기별로 나열 할 수 있습니다. du -h | 정렬 -hr | more 또는 du -h --max-depth = 0 * | 정렬 -hr | 더


0

저는 du를 간단한 방법으로 사용하는 경향이 있습니다.

du -sh */ | sort -n

이것은 어떤 디렉토리가 가장 많은 공간을 소비하는지에 대한 아이디어를 제공합니다. 그런 다음 나중에 더 정확한 검색을 실행할 수 있습니다.


이런 종류의 작동하지만 정렬 할 때 파일 크기 단위를 무시합니다.
Benjamin Engwall
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.