首页 > 解决方案 > 不能使用变量 rm -rf

问题描述

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

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

标签: bashubuntuconsolerm

解决方案


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

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

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

4)不要引用~,如果您希望外壳将其扩展为${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到最后,以查看哪些路径被删除。


推荐阅读