0

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

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

但是,当我执行此脚本时,它告诉我...

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

即使foobar是具有主目录的有效用户。我什至在运行它时遇到同样的错误user="root"。有什么想法可以解决这个问题,以便 find 命令在我的脚本中工作吗?

4

3 回答 3

2

波浪号扩展发生在参数扩展之前,因此波浪号~$user保持原样。你需要类似的东西

userHome=$( eval "echo ~$user" )
userHomeFiles=( $( find "$userHome" -print '%p\n' ) )

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

于 2013-05-02T18:24:50.347 回答
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")
于 2013-05-02T18:28:27.723 回答
0

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

$(find /home/$user -name "*" -printf "%p\\n")
于 2013-05-02T18:26:12.310 回答