似たようなものを探しています。
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
と1つ以上の開始ディレクトリなど、少なくとも2つの引数を使用して呼び出します。例えば、
rdu 1000 /var/log # threshold is 1000 KiB
rdu 1G /var /usr # threshold is 1 GiB
仕組みは次のとおりです。
du_pp
2つのサポート機能があります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