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


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 -h와 sort -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 (이전 버전 tree과 sed)

이것은 다음의 출력입니다. 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.