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


5

入力すると sudo du -sh ~student1 期待通りの出力が得られます(スクリーンショットを参照)。しかし、私が以下のスクリプトを使おうとすると:

#!/bin/bash

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

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

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

私は見ました 特定のユーザーの合計ディスク使用量 しかしそれは私が探していたものではありませんでした。

回答:


4

シェルはパラメータを拡張することでシングルパスを行います。 $user 展開されますが、前の ~ それから展開されません。入力行を再解析するために、 eval

...
eval sudo du -sh ~$user
...

1
そうです。チルダ展開は変数展開の前に行われるからです。 bashそれからどちらも sudo また du チルダを拡大します。
Kamil Maciorowski

ご了承ください ~ ユーザーシェルでは展開されるので、パーミッションが特定のユーザーの展開をここで妨げている場合は、 sudo これを上書きしません。
AFH

1
@xenoid - ユーザのホームディレクトリのデフォルトオプションは確かに /home/$userただし、これはアカウント作成時に上書きすることも、後で変更することもできます。のデフォルトでもありません root少なくともUbuntuや(おそらく)他のDebian派生ディストリビューションではそうではない。使うなら sudo スクリプトの外側では、呼び出し側のシェルとは異なる環境で実行されることになります。これには、他にも影響があります。 $PATH どっち sudo を使用します。
AFH

1
@xenoid - trueではありません。パラメータ内のセミコロンで区切られます。 sudo このコマンドの残りの部分はユーザー特権で実行されます。ここには、 eval 意図しない結果を招く可能性がありますが、これはそれらの1つではありません。いずれにせよ、 sudo 危険なことをするために特権がこれほどあいまいなものを使う必要はない sudo とにかく拒否されたスクリプトは実行できません。
AFH

1
私は問題を見ません。もし sudo スクリプト内の同じ行で実行しても、後で別のコマンドとして実行しても構いません。私はあなたのすべてのコメントに答えました、そしてあなたは実行可能な代替案を提案していません。この会話はどこにも近づいていないので、私はそれを続けるつもりはありません。あなたのコメントをありがとう、しかし我々は異なることに同意しなければならないでしょう。
AFH

0
find . -printf "%u  %s\n" | awk '{user[$1]+=$2}; END{ for( i in user) print i " " user[i]}'

同じ機能

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

スーパーユーザーへようこそ。私たちはいつも答えの説明を見て幸せです。多分あなたは何が起こるのか説明することができます。
davidbaumann

0

@AFHで述べたように、チルダ( ~ )展開されていない、あなたが使用することが eval これを処理するために...

またはあなたが使用することができます getent ユーザーのホームディレクトリを取得するには

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

このようにして(不可解な変数展開の問題よりも)エラーを検出する方が簡単です。

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

$ getent passwd | cut -d: -f6 | grep -E '^/home/'
/home/attie
/home/bill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.