测试文件存在于多个用户之间的特定用户的文件夹中

时间:2011-03-05 14:14:36

标签: macos bash

我制作了一个以root身份执行的bash脚本,必须验证用户桌面中是否存在文件。这是代码:

if [ -e /Users/*/Desktop/file ]; then
....

事实是,如果/Users/中有多个用户,并且该文件不在第一个用户中(按字母顺序排列),但在其中一个用户中,它将失败。

所以为了解决这个问题,我认为这很好:

if [ -e ~/Desktop/file ]; then
....

但是,由于脚本是以root身份执行的,~/Desktop//private/var/root/Desktop而不是/Users/my_user/Desktop

我现在用bash不太放心,所以我希望你能帮我解决这个问题!谢谢!

3 个答案:

答案 0 :(得分:0)

你可以在bash中使用 for loop 依次测试每个用户的主目录,例如:

for d in /Users/*
do
    if [ -e "$d/Desktop/file" ]
    then
        echo "The file existed under $d"
    else
        echo "The file was not found under $d"
    fi
done

/Users/*扩展为/Users/alice /Users/bob /Users/charles(或其他),然后$d在循环内依次给出每个值的值。显然,你可以用任何你想要做的事情替换echo的陈述。

bash手册中关于循环结构的部分,包括for循环,is here - 可能不是最好的起点,但你可以在Google上找到很多例子。

关于这个答案需要注意的一点是,如果你是严格的,用户的主目录就不必被称为/ Users / username - 严格来说你需要查看/etc/passwd来查找全部用户及其相应的主目录。但是,对于你想要做的事情,这可能就足够了。


更新1:如果没有任何用户存在匹配/Users/*/Desktop/file的文件,则从下面的评论中发出声音,就好像您想要采取行动一样。这对我来说听起来很奇怪,但如果你真的想这样做,你可以使用this other Stack Overflow问题中的一个食谱,例如:

if [ -z "$(shopt -s nullglob; echo /Users/*/Desktop/file)" ]
then
    echo "No one had a file in ~/Desktop/file"
fi

更新2:您对Dennis Williamson's answer的评论表明此脚本应由此计算机上的非root用户运行。如果是这样,那么我认为他在评论中的建议是正确的 - 你只想测试:

if [ -e "$HOME/Desktop/file" ]
then
    echo "Found the file"
else
    echo "Failed to find the file"
fi

...然后你只需确保以非root用户身份进行测试。

答案 1 :(得分:0)

在问题的标题中,您说“特定用户”。为什么不命名特定用户?

if [ -e /Users/username/Desktop/file ]

如果您要查找此类文件,请使用find

find /Users -path '/Users/*/Desktop/*' -name 'file'

答案 2 :(得分:0)

我不明白吗?为什么不指定该特定用户{1}的主目录?

我认为你想要那个。所以该行看起来像:

~youruser/Desktop

我是否正确理解了问题? 只需在'linux tilde expansion'上搜索谷歌

注意不要在波浪号周围加上引号。 关于如何使用引号,请阅读讨论:https://stackoverflow.com/a/3984130/1579985