![가장 큰 파일이나 디렉터리 찾기](https://linux55.com/image/1098/%EA%B0%80%EC%9E%A5%20%ED%81%B0%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%EB%82%98%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%20%EC%B0%BE%EA%B8%B0.png)
tmp 디렉토리에 있는 모든 파일 및 디렉토리(숨겨진 파일 및 디렉토리 포함)의 크기를 인쇄하고 사람이 읽을 수 있는 형식(예: 2GB)으로 가장 큰 것부터 작은 것까지 크기별로 정렬하는 명령은 무엇입니까?
출력은 다음과 같을 수 있습니다.
file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)
ls
및 명령을 사용해 보았지만 du
올바른 스위치를 찾을 수 없습니다.
답변1
다음은 빠른 수정 방법입니다. du + sort를 사용하세요. 이 시도:
du -smc * | sort -n
이렇게 하면 숨겨진 파일이 무시되지만 여기에 또 다른 간단한 수정 방법이 있습니다.
du -smc .[^.] .??* * | sort -n
위의 패턴 중 하나 이상이 파일과 일치하지 않으면 경고가 발생할 수 있습니다. 첫 번째 패턴은 . .[^.]
로 시작하는 모든 두 문자 파일 이름과 일치합니다. 두 번째 패턴은 .. 를 제외하고 .. .??*
로 시작하는 세 글자 이상의 모든 파일 이름과 일치합니다. *로 끝나지 않는 모든 파일과 일치합니다.
답변2
아래 위치에 있는 파일을 /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
(이 세 명령의 차이점에 대한 예: file 이 있는 경우 /tmp/dir/file
첫 번째 명령은 를 나열하고 /tmp/dir/file
, 두 번째 명령은 을 나열하고 /tmp/dir
, 세 번째 명령은 두 가지를 모두 나열합니다.)
위의 모든 명령은 크기를 킬로바이트 단위로 표시합니다. GNU du는 "사람이 읽을 수 있는" 크기(k, M, G 등의 승수 사용)를 출력할 수 있지만 이를 정렬하는 것은 또 다른 문제입니다. 충분한 최신 GNU coreutils(≥7.4)가 이 작업을 수행할 수 있습니다. 그냥 and du -k
로 바꾸면 됩니다 . 그렇지 않은 경우에는 접미사 크기(반내림)로 변환하기 위한 대략적인 awk 스크립트가 있습니다. 위의 출력을 여기에 파이프하면 됩니다.du -h
sort -k1n -k2
sort -k1h -k2
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}'
답변3
나는 다음 별칭을 사용합니다.alias ds='du -x --all --max-depth=1 . | sort -n'
현재 디렉터리와 첫 번째 수준 하위 디렉터리에 있는 모든 파일의 크기를 인쇄합니다.
답변4
고쳐 쓰다:이전 스크립트를 폐기했습니다. 이는 du
및를 사용하는 새 버전입니다
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."*
#