我正在尝试编写一个脚本,以递归方式列出所有给定用户的主文件和目录的绝对路径,并将所有这些文件写入数组。目前,我正在使用这样的发现......
user="foobar"
usersHomeFiles=( $(find ~$user -printf "%p\\n") )
然而,当我执行这个脚本时它会告诉我......
find: `~foobar': No such file or directory
即使foobar
是具有主目录的有效用户。我用user="root"
运行它时遇到同样的错误。任何想法如何解决这个问题所以find命令在我的脚本中有效?
答案 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")