不能 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"/*
应该可以再次使用了。
我正在尝试编写一个 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"/*
应该可以再次使用了。