在find命令中使用变量username的脚本

时间:2013-05-02 18:13:34

标签: bash

我正在尝试编写一个脚本,以递归方式列出所有给定用户的主文件和目录的绝对路径,并将所有这些文件写入数组。目前,我正在使用这样的发现......

user="foobar"
usersHomeFiles=( $(find ~$user -printf "%p\\n") )

然而,当我执行这个脚本时它会告诉我......

find: `~foobar': No such file or directory

即使foobar是具有主目录的有效用户。我用user="root"运行它时遇到同样的错误。任何想法如何解决这个问题所以find命令在我的脚本中有效?

3 个答案:

答案 0 :(得分:2)

Tilde扩展在参数扩展之前发生,因此波形符~$user保持原样。你需要像

这样的东西
userHome=$( eval "echo ~$user" )
userHomeFiles=( $( find "$userHome" -print '%p\n' ) )

虽然我希望有人会发布eval免费解决方案。除非您完全确定user

的内容,否则这是不安全的

答案 1 :(得分:2)

这是因为在bash中“波浪扩展”发生在“参数扩展”之前。因此代字号扩展试图找到用户“$ user”,这会失败并且代字号保持不变。接下来是“参数扩展”,用“foobar”代替“$ user”。请参阅bash(1)“扩展”部分。

执行此操作的一种方法是使用“eval”,如下所示:

user_home=`eval "echo ~$user"`

另一个是直接查询passwd数据库,如下所示:

user_home=`getent passwd "$user" | cut -d: -f6`

但是,请注意,如果用户主目录包含带空格或制表符的文件名,则数组分配将中断。

您可以使用“readarray”更可靠地阅读它们,如下所示:

readarray -t usersHomeFiles < <(find "$user_home")

答案 2 :(得分:0)

您可能需要在find命令中添加几个选项,即find开始搜索的路径和-name标志,即:

$(find /home/$user -name "*" -printf "%p\\n")