"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と1つ以上の開始ディレクトリなど、少なくとも2つの引数を使用して呼び出します。例えば、

rdu 1000 /var/log    # threshold is 1000 KiB
rdu 1G /var /usr     # threshold is 1 GiB

仕組みは次のとおりです。

du_pp2つのサポート機能がありますdu_ck。 1つ目は、KiB値をMiB、GiB、TiB、またはPiB単位の「人間が読める」値に変換します。 2番目は文字列を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

おすすめ記事