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

Bash 在find命令中使用变量username的脚本,bash,Bash,我试图编写一个脚本,递归列出给定用户的所有主文件和目录的绝对路径,并将它们全部写入一个数组。目前,我正在使用像这样的查找 user="foobar" usersHomeFiles=( $(find ~$user -printf "%p\\n") ) 然而,当我执行这个脚本时,它告诉我 find: `~foobar': No such file or directory 即使foobar是具有主目录的有效用户。我甚至在运行user=“root”时也会遇到同样的错误。有没有办法解决这个问题,让f

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

user="foobar"
usersHomeFiles=( $(find ~$user -printf "%p\\n") )
然而,当我执行这个脚本时,它告诉我

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

即使
foobar
是具有主目录的有效用户。我甚至在运行
user=“root”
时也会遇到同样的错误。有没有办法解决这个问题,让find命令在我的脚本中工作?

Tilde展开发生在参数展开之前,因此Tilde
~$user
保持原样。你需要像这样的东西

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

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

Tilde展开的内容发生在参数展开之前,因此Tilde
~$user
保持不变。你需要像这样的东西

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

虽然我希望有人会发布一个
eval
-免费解决方案。这是不安全的,除非您完全确定
用户

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

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

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

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

这是因为在bash中,“tilde扩展”发生在“参数扩展”之前。因此,tilde扩展尝试查找用户“$user”,但失败,tilde保持不变。接下来是“参数扩展”,将“$user”替换为“foobar”。请参见bash(1)“扩展”部分

一种方法是使用“eval”,如下所示:

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")
另一种方法是直接查询passwd数据库,如下所示:

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")
但是,请注意,如果用户主目录包含带空格或制表符的文件名,则数组分配将中断

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

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")

readarray-t usersHomeFiles<发生这种情况是因为在bash中,“tilde扩展”发生在“参数扩展”之前。因此,tilde扩展尝试查找用户“$user”,但失败,tilde保持不变。接下来是“参数扩展”,将“$user”替换为“foobar”。请参见bash(1)“扩展”部分

一种方法是使用“eval”,如下所示:

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")
另一种方法是直接查询passwd数据库,如下所示:

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")
但是,请注意,如果用户主目录包含带空格或制表符的文件名,则数组分配将中断

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

user_home=`eval "echo ~$user"`
user_home=`getent passwd "$user" | cut -d: -f6`
readarray -t usersHomeFiles < <(find "$user_home")

readarray-t usersHomeFiles<使用zsh而不是bash来回答相关问题可能会有帮助,尽管它与我下面的答案有相同的警告。使用zsh而不是bash来回答相关问题可能会有帮助,尽管它与我下面的答案有相同的警告。为了避免评估,你不能做一些像userhome=$(echo“~${user}”)这样的事情吗。。。没有,只是尝试了一下,但没有效果。为了避免评估,你不能做一些像userhome=$(echo“~${user}”)。。。没有,只是试了一下,但没用。