가장 큰 파일 또는 디렉토리 찾기


10

tmp 디렉토리 (숨겨진 파일 포함)에있는 모든 파일과 디렉토리의 크기를 인쇄하여 사람이 읽을 수있는 형식 (예 : 2GB)에서 가장 큰 것부터 가장 작은 것까지 어떤 명령으로 정렬합니까?

출력은 다음과 같습니다.

file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)

lsand du명령 을 사용하려고했지만 올바른 스위치를 찾지 못했습니다.

답변:


7

다음은 빠른 수정입니다. du + sort를 사용하십시오. 이 시도:

du -smc * | sort -n

숨겨진 파일은 무시하지만 다른 쉬운 수정 방법입니다.

du -smc .[^.] .??* * | sort -n

위의 패턴 중 하나 이상이 파일과 일치하지 않으면 경고가 발생할 수 있습니다. 첫 번째 패턴 .[^.]은로 시작하는 두 문자 파일 이름과 모두 일치합니다. ..을 제외하고 두 번째 패턴은로 .??*시작하는 세 글자 이상의 파일 이름과 모두 일치합니다. *는로 시작하지 않는 모든 파일과 일치합니다. 전체 파일 시스템에서 X보다 큰 모든 파일을 찾거나 파일 시스템 증가 목록을 유지하는 것과 같은보다 정교한 목록을 위해 필자가 작성한 DIY 쉘 스크립트가 있으며 관심이 있다면 공유 할 수 있습니다.


감사합니다. 당신이 그렇게 친절하면 나는 당신의 대본에 관심이 있습니다.
xralf

1
sort -nr가장 큰 값을 원하면 사용하십시오 .
LawrenceC

3

아래에 파일 /tmp을 크기별로 정렬 하려면 :

find /tmp -type f -exec du -k {} + | sort -k1n -k2

바로 아래에 파일 및 디렉토리 트리 /tmp를 크기별로 정렬 하려면 다음을 수행하십시오 .

du -k /tmp/..?* /tmp/.[!.]* /tmp* 2>/dev/null | sort -k1n -k2

아래의 모든 파일 및 디렉토리 트리 /tmp를 크기별로 정렬 하려면 다음을 수행하십시오 .

du -ak /tmp | sort -k1n -k2

(세 가지 명령의 차이점을 설명하는 예제 : 파일이 있으면 /tmp/dir/file첫 번째 명령 목록 /tmp/dir/file, 두 번째 목록 /tmp/dir및 세 번째 목록이 모두 있습니다.)

위의 모든 명령은 킬로바이트 단위의 크기를 보여줍니다. GNU du는 "사람이 읽을 수있는"크기 (k, M, G 등의 승수)를 출력 할 수 있지만, 정렬은 또 다른 문제입니다. 최근에 충분한 GNU의로 coreutils (≥7.4)는 그것을 할 수 있습니다 만 교체 du -k와 함께 du -hsort -k1n -k2함께 sort -k1h -k2. 그렇지 않으면 다음은 접미사 크기로 변환하는 조잡한 awk 스크립트입니다 (내림차순). sort위 의 출력을 그 안에 파이프하십시오 .

awk -vFS='\t' -vOFS='\t' '{
    if ($1) $1 = substr($1,1,(length($1)-1)%3+1)
                 substr("kMGTPEZY",(length($1)-1)/3+1,1);
    print}'

감사합니다. 이러한 명령은 유용하지만 하위 디렉토리의 파일이 아닌 tmp 바로 아래의 파일 및 디렉토리에만 관심이 있습니다.
xralf

1
@xralf : 그런 다음 두 번째 형태의 du호출 만 사용 하십시오.
Gilles 'SO- 악마 중지'

좋아 보이지만 forcefsck가 게시 된 것처럼 MB 및 GB가 더 좋습니다.
xralf

3

나는 그것을 위해 다음과 같은 별칭을 사용하고 있습니다 : alias ds='du -x --all --max-depth=1 . | sort -n'

모든 파일의 크기와 현재 디렉토리의 1 단계 하위 디렉토리를 인쇄합니다.


좋은 짧은 해결책이지만 디렉토리 만 인쇄합니다.
xralf

아 죄송합니다. 나는 파일 로이 문제에 직면 한 적이 없다. Howewer, 나는 파일로 작동시키는 방법을 찾았습니다 : using --all swicth.
RVS

훌륭한 올바른 솔루션. penguin359는 MB 단위의 크기를 보여주기 때문에 약간 더 좋습니다. 최선의 방법은 forcefsck의 솔루션이지만 그의 솔루션은 공백이있는 디렉토리를 생략합니다.
xralf

1

gnu sort의 현재 버전 (및 @ penguin359 파일 패턴 빌림)

cd /tmp; du -sShc .[^.] .??* * | sort -h

오래된 버전으로

cd /tmp
foo=$(du -sShc .[^.] .??* *)
for u in K M G T; do
    echo "$foo" | egrep "^[0-9\.]+$u" | sort -n
done

편집 : -S 매개 변수를 추가 du하여 하위 디렉토리를 포함하지 않았습니다.


파일과 디렉토리 (내부 데이터의 전체 크기)가 tmp (하위 디렉토리가 아닌)에서 직접 사용하는 디스크 공간을 원했습니다. 내 정렬 명령에는 -h 옵션이 없습니다.
xralf

동일한 파일 패턴 선택으로 이미 답변을 수락했기 때문에 무슨 의미인지 100 % 확신 할 수 없습니다. 하위 디렉토리를 포함하지 않도록 게시물을 수정했습니다. 실제 디스크 공간이 아닌 겉보기 크기를 원하면 --apparent-sizedu 매개 변수를 추가 할 수 있습니다 .
forcefsck

이제 잘 작동합니다. GB를 찾은 다음 MB 만 찾으면되지만 문제는 없습니다.
xralf

단위 문자가 잘못된 순서로 표시되어 수정되었습니다. 순서를 큰 순서에서 작은 순서로하려면 단위 문자의 순서를 변경하고 -r을 추가하여 정렬하십시오.
forcefsck

나는 디렉토리의 크기를 인쇄하는 것을 잊었다. (. 프리픽스없이)
xralf

0

업데이트 : 이전 스크립트를 삭제했습니다. 다음은 duand를 사용하는 새 버전입니다 awk (이전 버전 treesed)

이것은 다음의 출력입니다. dusort ~/test 1

================
dir     4.10 KiB  /home/user/test/bdir
dir     4.98 KiB  /home/user/test/Kdir
dir   104.91 MiB  /home/user/test/Mdir
dir   587.47 MiB  /home/user/test/Gdir
dir   692.39 MiB  /home/user/test
================
 f      0    Byt  /home/user/test/new file
 f     42    Byt  /home/user/test/.hi   dd     en
================

여기 스크립트가 있습니다

units() { awk -v pfix="$1" \
  'BEGIN { yect=6  # Array element-count
    split("Byt KiB MiB GiB TiB PiB",lbl)
    for (i=1;i<=yect;i++) { val[i] = (2**(10*(i-1)))-1 } 
  }
  { yess=yect  # Array element-subscript
    while ( $1 < val[yess] ){ yess-- }
    num = $1 / (val[yess]+1)
    sub(/^[0-9]*\t*/,"")
    if (yess!=1) { printf "%s %8.2f %s  %s\n", pfix, num, lbl[yess], $0 }
    else        { printf "%s %5d    %s  %s\n", pfix, num, lbl[yess], $0 }
   }'
}
tdir="/tmp/$USER/$(basename $0)"
[[ ! -d "$tdir" ]] && mkdir -p "$tdir"
file="$tdir/$(date +%N)"
echo "================"
dirs="$file.dirs";   du --max-depth=$2 -b $1  >"$dirs" ; <"$dirs"  sort -n           | units "dir"
echo "================"
filz="$file.filz"; { du --max-depth=$2 -ab $1 ; cat "$dirs" ; } | sort -n | uniq -u  | units " f "
echo "================"
rm   "$file."* 
#

모든 파일과 디렉토리의 크기 를 말할 때 각 항목이 디스크에서 차지하는 공간을 의미합니다 (예 : Ubuntu ext4 파일 시스템에서 빈 디렉토리는 4k의 디스크 공간을 차지하고 4k보다 작은 파일은 4k를 차지합니다) 최소 할당량 청크는 4k입니다 .. 또는 각 파일 의 데이터 양을 의미합니까 (예 : 100 (바이트)). 디렉토리의 경우 해당 디렉토리 의 총 파일 데이터 를 알고 싶습니까? 파일 내부 의 데이터 크기를 원한다면 tree그렇게하십시오. 디스크 공간을 사용하려면 다음을 du수행하십시오. ( tree디렉토리를 계산하지 않습니다)
Peter.O

'du' 가 더 나은 선택입니다 ... 방금 살펴 보았습니다 . 일반 파일 또는보다 일반적으로 stat --format = % man du에서 "명확한 파일 크기"를 보고 할 수도 있습니다 . 에스'. 예를 들어, 단어를 포함하는 파일The apparent size of a file is the number of bytes reported by ls -l --block-size=1' or zoo' with no newline would, of course, have an apparent size of 3.
Peter.O

파일과 디렉토리 (내부 데이터의 전체 크기)가 tmp (하위 디렉토리가 아님) 바로 아래에서 사용되는 디스크 공간을 원했습니다.
xralf

죄송합니다. 쉘 스크립팅 단계에 있지 않아 아직 이해할 수 없으므로 다른 사용자가 답변이 얼마나 좋은지 결정할 수 있습니다. 작업 해 주셔서 감사합니다. 더 나아질 때 공부하겠습니다.
xralf

0
find /tmp -exec du {} + | sort -nr | less 

가장 큰 파일을 먼저 표시하므로 q충분히 보자 마자 바로 사용할 수 있습니다 .

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