【问题标题】:Cannot rm -rf using variable不能使用变量 rm -rf
【发布时间】:2019-11-22 06:05:34
【问题描述】:

我正在尝试编写一个 BASH 脚本,它将递归删除目录中的所有文件。

当我在控制台rm -rf /home/dir/dir/* 中编写时,它工作得很好,但我不能使用变量来做到这一点。

VAR="/home/dir/dir"
rm -rf "$VAR"/*

此代码对我不起作用。

更新。 这真的很奇怪。我试过删除引号,但没有用。

这是我的整个文件:

#### VARIABLES

LOGS_PATH="~/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega\ test"

#### End of variables


#### FUNCTIONS

delete_logs()
{
    rm -rf $LOGS_PATH/*
    echo "Logs from $LOGS_PATH were deleted"

}

#### End of functions

#### MAIN

delete_logs

#### End of main

在输出中它显示了文件的正确路径...

【问题讨论】:

  • 你得到什么错误? echo "$PATH"/*" 打印什么?你真的使用PATH 作为你的变量吗?
  • 你确定要在这里使用系统变量PATH吗?
  • 1: 不要使用PATH2: DO NOT 构造这个,这样就可以让那个变量为空,特别是如果你以 root 身份执行它... 3: 你遇到了什么错误?
  • 对不起。我忘记了,PATH是系统变量。我已经改了。
  • 如果使用的变量包含代字号来引用用户的主目录,我发现了一些问题。因此,例如ls "~" 不起作用。但是如果你做rm -rf "$VAR"/*之类的事情,你应该非常小心。如果VAR 为空,你知道会发生什么......

标签: bash ubuntu console rm


【解决方案1】:

您可以通过使用变量 home 来避免波浪号问题。 所以就写吧

LOGS_PATH="${HOME}/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test" 

而不是

LOGS_PATH="~/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test" 

和命令

rm -rf "$LOGS_PATH"/*

应该可以再次使用。

【讨论】:

    【解决方案2】:

    1) 删除双引号字符串内空格前面的\。您不需要转义引号内的空格。 rm 命令(或者更确切地说是 expansion 期间的 shell)正在寻找包含反斜杠和空格的路径,这可能是错误的。

    2) 需要引用变量的使用,以使包含的空格不会干扰word splitting

    3) 如果文件夹为空,shell 将无法展开*(除非您设置了某些选项)。然后rm 命令将查找包含* 的文件,当然会失败。

    4) 不要引用~,如果您希望shell 将其扩展为${HOME}。或者干脆直接使用${HOME},因为shell处理~的规则有点棘手。

    既然你想删除文件夹的内容,你最好使用find

    LOGS_PATH="${HOME}/Документы/tellbot_work/tellbot-autotest/mega-test/Reports/Mega test"
    
    find "${LOGS_PATH}" -depth -mindepth 1 -delete
    
    • -depth 将告诉find 操作深度优先,即在“找到”文件夹本身之前“找到”文件夹的内容。这是必要的,因为您要删除找到的结果,必须是文件或文件夹,因此必须从内到外进行。
    • -mindepth 1 将告诉 find 从结果中排除基目录,因此您不要删除基目录
    • -delete 会告诉 find 删除找到的路径。

    省略-delete 仅查看结果,而不删除它们。你可以在末尾添加-print,看看哪些路径被删除了。

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 2013-01-10
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多