tmp 디렉토리 (숨겨진 파일 포함)에있는 모든 파일과 디렉토리의 크기를 인쇄하여 사람이 읽을 수있는 형식 (예 : 2GB)에서 가장 큰 것부터 가장 작은 것까지 어떤 명령으로 정렬합니까?
출력은 다음과 같습니다.
file.mpg 2GB
file.avi 1.8GB
.backtup 1.7 GB (this is directory)
ls
and du
명령 을 사용하려고했지만 올바른 스위치를 찾지 못했습니다.
답변
다음은 빠른 수정입니다. du + sort를 사용하십시오. 이 시도:
du -smc * | sort -n
숨겨진 파일은 무시하지만 다른 쉬운 수정 방법입니다.
du -smc .[^.] .??* * | sort -n
위의 패턴 중 하나 이상이 파일과 일치하지 않으면 경고가 발생할 수 있습니다. 첫 번째 패턴 .[^.]
은로 시작하는 두 문자 파일 이름과 모두 일치합니다. ..을 제외하고 두 번째 패턴은로 .??*
시작하는 세 글자 이상의 파일 이름과 모두 일치합니다. *는로 시작하지 않는 모든 파일과 일치합니다. 전체 파일 시스템에서 X보다 큰 모든 파일을 찾거나 파일 시스템 증가 목록을 유지하는 것과 같은보다 정교한 목록을 위해 필자가 작성한 DIY 쉘 스크립트가 있으며 관심이 있다면 공유 할 수 있습니다.
답변
아래에 파일 /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}'
답변
나는 그것을 위해 다음과 같은 별칭을 사용하고 있습니다 : alias ds='du -x --all --max-depth=1 . | sort -n'
모든 파일의 크기와 현재 디렉토리의 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
하여 하위 디렉토리를 포함하지 않았습니다.
답변
업데이트 : 이전 스크립트를 삭제했습니다. 다음은 du
and를 사용하는 새 버전입니다 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."*
#
답변
find /tmp -exec du {} + | sort -nr | less
가장 큰 파일을 먼저 표시하므로 q충분히 보자 마자 바로 사용할 수 있습니다 .