"du -h" 명령을 실행하지만 현재 디렉터리가 임계값보다 크면 계속 진행됩니다.

"du -h" 명령을 실행하지만 현재 디렉터리가 임계값보다 크면 계속 진행됩니다.

비슷한 걸 찾고 있어요

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또는 GT표현되는 임계값 크기 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

관련 정보