Sudo du -sh ~student1
と入力すると、期待どおりの出力が得られます(スクリーンショットを参照)。ただし、以下のスクリプトを使用しようとすると、次のようになります。
#!/bin/bash
for user in "$@"; do
Sudo du -sh ~$user
done
同じことをすると、ディレクトリが存在しないというエラーが表示されます。 ここ はスクリーンショットです。
(私はSudo du -sh student1 student2...
を実行でき、bashスクリプトは役に立たないことを知っていますが、なぜそれが機能しないのかまだわかりません。)
特定のユーザーの合計ディスク使用量 を確認しましたが、探していたものではありませんでした。
シェルはパラメータの拡張に対してシングルパスを実行するため、$user
は展開されますが、前の~
は展開されません。入力行を再解析するには、eval
を使用します。
...
eval Sudo du -sh ~$user
...
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
@AFHで言及されているように、チルダ(~
)は展開されておらず、eval
を使用してこれを処理できます...
または、getent
を使用してユーザーのホームディレクトリを取得することもできます。
$ getent passwd attie | cut -d: -f6
/home/attie
このようにすると、(不思議な変数拡張の問題よりも)エラーの検出が簡単になります。
これを使用して、ユーザーディレクトリを列挙することもできます。
$ getent passwd | cut -d: -f6 | grep -E '^/home/'
/home/attie
/home/bill