ディスク消費量が500MBを超える/home/
ディレクトリに表示されているすべてのユーザーを見つけたいです。次のコマンドは期待どおりに機能します。
cd /home/ && du */ -hs
68K ajay/
902M john/
250M websites/
上記の例から、902M john/
のみが返されるべきです。
find
コマンドを同じ結果を出力するにはどうすればよいですか。
あなたは個々のファイルの行為を見つけるので、見つけることだけでこれを見つけることができず、ファイルサイズを追加するという概念はありません。 Findの出力を別のツールにパイプすることができますが、DUがほとんどの仕事をしているのはなぜ気になるのでしょうか。
du -sm */ | sort -k1,1n | awk '$1 > 500 { sub(/$/, "M", $1); print $0 }'
_
整数の比較を実行するには、末尾の "m"を削除する必要があるため、AWKテストは入力に含まれている「人間が読める」のサフィックスを扱います。出力のために、個人的には「M」サフィックスをスキップしますが、それが要求されたものです。
なぜあなたがfind
のようなものが欲しいのかわからないので、あなたがbash
で尋ねるものをするスクリプトレットです(ただし、見つかったように機能しません)。
max_size=$((500*1024))
cd /home/ && du -ks */ | while read size user ; do
if [ $size -gt $max_size ] ; then
echo "${user%/} exceeds quota"
fi
done
_
例:(小さいサイズで):
$ du -sk */
2948 a/
4 a b/
640 b/
48 qt/
$ du -ks */ | while read size user ; do if [ $size -gt 600 ] ; then echo "${user%/} exceeds quota" ; fi ; done
a exceeds quota
b exceeds quota
_
NS ${user%/}
末尾のスラッシュを抜けてください。
これにより、それらのファイルがどこにあるかにかかわらず、dir
の各ユーザーのファイルのディスク使用量(KB)を印刷します。
find dir -printf "%u %b\n" | Perl -n -e '@l = split; $sum{$l[0]} += $l[1]; END { foreach(sort(keys(%sum))) { print "$_ ",$sum{$_}/2," KiB\n"; }}'
_
Findコマンドは、dir
の各ファイルとディレクトリの所有者とブロック数を印刷します。 perlコマンドは、ユーザー名にキーを付けたハッシュに使用され、したがって各ユーザーのファイルサイズの合計を作成します。そしてハッシュの内容が印刷されます。
回答として投稿する。
私はdu -ms(du -ms)==追加の介入なしにawkによって処理できる一貫した出力を取得しました。あなたは人間が読める出力が良いことを訂正しているので、最終的な出力はそのためにもう一度処理されます。
#!/bin/bash
######################################################################
# AUTHOR: Joe Negron - LOGIC Wizards ~ NYC
# LICENSE: BuyMe-a-Drinkware: Dual BSD or GPL (pick one)
# USAGE: byteMe (bytes)
# ABSTRACT: Converts a numeric parameter to a human readable format.
# URL: http://www.logicwizards.net/2010/10/19/byteme-a-simple-binary-metrics-bash-script-howto-convert-bytes-into-kb-mb-gb-etc-using-bash-bc/
######################################################################
function byteMe() { # Divides by 2^10 until < 1024 and then append metric suffix
declare -a METRIC=('B' 'KB' 'MB' 'GB' 'TB' 'XB' 'PB') # Array of suffixes
MAGNITUDE=0 # magnitude of 2^10
PRECISION="scale=1" # change this numeric value to inrease decimal precision
UNITS=`echo $1 | tr -d ','` # numeric arg val (in bytes) to be converted
while [ ${UNITS/.*} -ge 1024 ] # compares integers (b/c no floats in bash)
do
UNITS=`echo "$PRECISION; $UNITS/1024" | bc` # floating point math via `bc`
((MAGNITUDE++)) # increments counter for array pointer
done
echo -n "$UNITS${METRIC[$MAGNITUDE]}"
}
cd /home/ && du */ -bs | awk '$1 > 500 { print $0 }' | while read LINE; do
SIZE=$(echo "$LINE" | cut -f 1)
HRSIZE=$(byteMe "$SIZE")
DIR=$(echo "$LINE" | cut -f 2)
printf "%8s %s\n" "$HRSIZE" "$DIR"
done
_
ノート: