【问题标题】:Script that uses variable username in find command在 find 命令中使用变量用户名的脚本
【发布时间】:2013-04-27 00:45:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 使用 zsh 代替 bash
  • This answer 到一个相关的问题可能会有所帮助,尽管它与我在下面的回答有同样的警告。

标签: bash


【解决方案1】:

这是因为在 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】:

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

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

    虽然我希望有人会发布eval-free 解决方案。除非您完全确定 user 的内容,否则这是不安全的。

    【讨论】:

    • 为了避免 eval,你不能做类似 userhome=$( echo "~${user}" )... 不,刚刚尝试过,但不起作用。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 2015-11-15
      • 2014-04-29
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多