当我输入时,sudo du -sh ~student1
我得到了我期望的输出(见屏幕截图)。但是当我尝试使用以下脚本时:
#!/bin/bash
for user in "$@"; do
sudo du -sh ~$user
done
做同样的事情,我收到一个错误,目录不存在。这里是屏幕截图。
(我知道我可以做到sudo du -sh student1 student2...
,并且 bash 脚本是无用的,但我仍然不明白为什么它不起作用。)
我看了 特定用户的总磁盘使用量但这并不是我想要的。
答案1
shell 只对扩展参数进行一次传递,因此$user
进行了扩展,但前面的内容~
并未进行扩展。要重新解析输入行,请使用eval
:
...
eval sudo du -sh ~$user
...
答案2
正如@AFH 所提到的,波浪号 ( ~
) 没有展开,您可以用eval
它来处理这个问题......
或者您可以使用getent
来获取用户的主目录:
$ getent passwd attie | cut -d: -f6
/home/attie
这样,就更容易检测到错误(而不是神秘的变量扩展问题)。
您甚至可以使用它来枚举用户目录:
$ getent passwd | cut -d: -f6 | grep -E '^/home/'
/home/attie
/home/bill
答案3
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