不能 rm -rf 使用变量

Cannot rm -rf using variable

我正在尝试编写一个 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

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

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

2) 变量的使用需要被引用以便包含的 spaces 不干扰 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深度操作,即"find"先"finding"一个文件夹的内容文件夹本身。这是必须的,因为要删除找到的结果,必须是文件或者文件夹,所以必须从里到外进行。
  • -mindepth 1 会告诉 find 从结果中排除基本目录,所以你不要删除基本目录
  • -delete 会告诉 find 删除找到的路径。

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

您可以通过使用变量 home 来避免 tilde-problem。 所以只写

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"/*

应该可以再次使用了。