비슷한 걸 찾고 있어요
du -h /var/log/ --max-depth=2 --threshold=5G
이 아니라면du
공간이 이 임계값을 초과하면 현재 디렉터리에서 다시 실행합니다.. 원본 출력을 복제하지 않고 순서를 유지하는 방법이 있습니까?
예를 들어 임계값이 5Gb인 경우:
10.3G /lib/
8.9G /lib/lib1
2.1G /lib/lib1/files1
6.3G /lib/lib1/files2
3.2G /lib/lib1/files2/foz
1.3G /lib/lib2
8.3G /tmp/
8.2G /tmp/foo
5.2G /tmp/foo/bar
5.1G /tmp/foo/bar/bar1
900M /tmp/foo/bar/bar2
1.0G /tmp/foo/bat
1.0G /tmp/foo/baz
처음에 명령을 시도했을 때 원하는 결과를 얻지 못했습니다. for 루프나 du 명령을 함수에 넣는 것이 도움이 될까요? 미리 감사드립니다
답변1
직접 전달할 수 있는 것은 아니지만 du
약간의 재귀 쉘 스크립팅을 사용하면 원하는 것에 대한 대략적인 정보를 제공할 수 있을 만큼 충분히 마무리할 수 있습니다.
먼저, 예를 들어 이 모든 것을 파일에 넣고 /usr/local/bin/rdu
실행 가능하게 만듭니다.
#!/bin/bash
shopt -s dotglob
# Pretty printer
du_pp() {
local value=$1 unitIndex=0 units="KMGTP"
while [ $value -ge 1024 ]
do
((unitIndex++)); value=$((value/1024))
done
echo "$value${units:$unitIndex:1}"
}
# Convert to K
du_ck() {
local value=$1 l=${#1} unit
((l--))
unit=${value:$l:1}
[[ 'KMGTP' == *"$unit"* ]] && value=${value:0:$l} || unit='K'
until [ "$unit" = 'K' ]
do
case "$unit" in
M) value=$((value*1024)) unit='K';;
G) value=$((value*1024)) unit='M';;
T) value=$((value*1024)) unit='G';;
P) value=$((value*1024)) unit='T';;
esac
done
echo $value
}
# Call du, recursively expanding nodes greater than the threshold
du_rx() {
local threshold=$1
shift
local starts=("$@")
du -ks "${starts[@]}" |
while IFS=$'\t' read -r size dir
do
printf '%s\t%s\n' "$(du_pp "$size")" "$dir"
if [ -d "$dir" ] && [ $size -ge $threshold ]
then
[ "$dir" == '/' ] && dir=
du_rx "$threshold" "$dir"/*
fi
done
}
# Call du_rx 1024000 /var
threshold=$(du_ck $1)
shift
starts=("$@")
du_rx $threshold "${starts[@]}"
K
(기본값), M
또는 G
로 T
표현되는 임계값 크기 P
와 하나 이상의 시작 디렉터리 등 최소한 두 개의 인수를 사용하여 호출합니다 . 예를 들어,
rdu 1000 /var/log # threshold is 1000 KiB
rdu 1G /var /usr # threshold is 1 GiB
작동 방식은 다음과 같습니다.
du_pp
두 가지 지원 기능 이 있습니다 du_ck
. 첫 번째는 KiB 값을 MiB, GiB, TiB 또는 PiB 단위의 "사람이 읽을 수 있는" 값으로 변환합니다. 두 번째는 문자열을 4G
동등한 KiB 값으로 변환합니다. 둘 다 불안정하지만 대부분의 상황에서 작동합니다.
드라이버 기능은 재귀적입니다 du_rx
. 이는 시작 디렉터리의 항목을 반복하고 du -s
이를 호출하여 다이제스트 크기를 가져옵니다. 다이제스트 크기가 임계값을 초과하면 현재 프로젝트를 새 시작 디렉터리로 사용하여 함수가 자체적으로 호출됩니다.
디렉토리뿐만 아니라 du
모든 항목이 출력됩니다. 다음 블록을 래핑하면 이를 방지할 수 있습니다.
printf '%s\t%s\n' "$(du_pp "$size")" "$dir"
if [ -d "$dir" ] && [ $size -gt $(du_ck "$threshold") ]
then
[ "$dir" == '/' ] && dir=
du_rx "$threshold" "$dir"/*
fi
이와 같이
if [ -d "$dir" ]
then
printf '%s\t%s\n' "$(du_pp "$size")" "$dir"
if [ $size -gt $(du_ck "$threshold") ]
then
[ "$dir" == '/' ] && dir=
du_rx "$threshold" "$dir"/*
fi
fi