bash - 不能使用变量 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
在输出中,它显示了文件的正确路径...
解决方案
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
到最后,以查看哪些路径被删除。
推荐阅读
- laravel - 使用数据库管理器迁移脚本更新 laravel/eloquent 模型时删除 sqlite 列失败
- hadoop - 在 Hadoop 中设置集群 - JPS 不显示 NodeManager 和 ResourceManager
- python - 使用 Selenium Python 在同一页面上单击多个按钮
- javascript - 如何重构这个冗长的 if/else
- javascript - 正则表达式查找字符串是否仅包含特殊字符或数字和特殊字符的混合
- php - 如何安全存储 api 密钥,模板文件
- android - Android:实时数据跳过值
- c++ - 成员参数扣除的可变参数模板
- python - 如何将 2017-W01 转换为日期?
- java - 如何判断一个对象是相同的还是不同的