web-dev-qa-db-ja.com

各ユーザーのディスク使用量の取得

Sudo du -sh ~student1と入力すると、期待どおりの出力が得られます(スクリーンショットを参照)。ただし、以下のスクリプトを使用しようとすると、次のようになります。

#!/bin/bash

for user in "$@"; do
    Sudo du -sh ~$user
done

同じことをすると、ディレクトリが存在しないというエラーが表示されます。 ここ はスクリーンショットです。

(私はSudo du -sh student1 student2...を実行でき、bashスクリプトは役に立たないことを知っていますが、なぜそれが機能しないのかまだわかりません。)

特定のユーザーの合計ディスク使用量 を確認しましたが、探していたものではありませんでした。

6
kg98

シェルはパラメータの拡張に対してシングルパスを実行するため、$userは展開されますが、前の~は展開されません。入力行を再解析するには、evalを使用します。

...
eval Sudo du -sh ~$user
...
4
AFH
find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}'

これは印刷されます

jsmith 928057466

同じ機能

find . -user jsmith -type f -printf "%s\n" | awk '{t+=$1}END{print t}'

これはちょうど印刷されます

928057466

0
Joniale

@AFHで言及されているように、チルダ(~)は展開されておらず、evalを使用してこれを処理できます...

または、getentを使用してユーザーのホームディレクトリを取得することもできます。

$ getent passwd attie | cut -d: -f6
/home/attie

このようにすると、(不思議な変数拡張の問題よりも)エラーの検出が簡単になります。

これを使用して、ユーザーディレクトリを列挙することもできます。

$ getent passwd | cut -d: -f6 | grep -E '^/home/'
/home/attie
/home/bill
0
Attie