web-dev-qa-db-ja.com

特定の量のディスク容量使用量を持つユーザーを選択する検索を使用する方法

ディスク消費量が500MBを超える/home/ディレクトリに表示されているすべてのユーザーを見つけたいです。次のコマンドは期待どおりに機能します。

cd /home/ && du */ -hs
68K     ajay/
902M    john/
250M    websites/

上記の例から、902M john/のみが返されるべきです。

findコマンドを同じ結果を出力するにはどうすればよいですか。

6
shantanuo

あなたは個々のファイルの行為を見つけるので、見つけることだけでこれを見つけることができず、ファイルサイズを追加するという概念はありません。 Findの出力を別のツールにパイプすることができますが、DUがほとんどの仕事をしているのはなぜ気になるのでしょうか。

du -sm */ | sort -k1,1n | awk '$1 > 500 { sub(/$/, "M", $1); print $0 }'
 _

整数の比較を実行するには、末尾の "m"を削除する必要があるため、AWKテストは入力に含まれている「人間が読める」のサフィックスを扱います。出力のために、個人的には「M」サフィックスをスキップしますが、それが要求されたものです。

0
Phil

なぜあなたが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%/}末尾のスラッシュを抜けてください。

4
Mat

これにより、それらのファイルがどこにあるかにかかわらず、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コマンドは、ユーザー名にキーを付けたハッシュに使用され、したがって各ユーザーのファイルサイズの合計を作成します。そしてハッシュの内容が印刷されます。

0
Heath

回答として投稿する。

私は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
 _

ノート:

  1. bash機能はグーグリングによって見つかりました(コメントを参照)
  2. 私は変更しましたdu -bsdu -b(du -b)==したがって、バイトを受け入れる変換関数を使用することが可能になります。
  3. 500MBの制限はまだハードコードされています。引数としてそれを受け入れるようにスクリプトを修正すること自由に感じます。
0
vtest