这样有一个空目录好吗?

这样有一个空目录好吗?

我想要一个mydir内容为空的目录,但我事先不知道它是否已经存在,或者何时存在,是否为空。所以我的方法是

mkdir -p mydir                                                                                                           
rm -f mydir/*

有什么缺陷吗?你更好的解决方案是什么?

答案1

缺陷在于您正在使用自动强制删除目录 - 当然,要删除其内容,您需要自动强制删除递归的删除目录。您将面临脚本中的安全漏洞。

例如,查看--one-file-system的标志rm。您可能不想删除安装在mydir...中的任何文件系统中的所有文件,因此您必须包含该标志(顺便说一下,它没有缩写)。

另外,绑定安装怎么样? (请参阅man mount并搜索bind。)从技术上讲,这些文件位于同一文件系统上......如何rm -rf处理这些文件?会把它们全部删除吗?这可能不是您想要的,但为了确保您必须研究它并测试rm与绑定安装相关的行为。可能还有很多我没有想到的其他边缘情况。

所有这些麻烦的出现都是因为你不真的想要“删除目录及其内容”;你什么实际上想要的是有一个空目录可以工作。

这里有一个一般原则——当你指定某件事时其他不是你特别想要的,因为你认为这是获得你想要的东西的途径,你通常会引入不必要的复杂性。要做的事情是找到如何指定你想要什么然后明确指定。*


正如 Jeff Schaller 在评论中指出的那样,更好的解决方案是使用mktemp,它实际上是为此目的而设计的。具体来说,来自man mktemp

Create a temporary file or directory, safely, and print its name.

创建目录的最简单用法mktemp如下:

mydir="$(mktemp -d)"

然后你可以将文件复制到其中,如下所示:

cp somefile "$mydir/"

在脚本结束时,当您完成目录的操作后,您可以安全地使用以下命令删除它(以及您放入其中的任何内容):

rm -rf "$mydir"

*此原则的另一个示例是使用sed命令来处理基于字段或基于列的文件。你也许可以做到......但你可以指定确切地通过使用您想要的东西awk,并且复杂性要低得多。

答案2

mkdir失败是因为它应该失败。这是好事。失败的命令是指在职的。它正确地返回给您一个可测试的错误代码。所以简单的事情就是测试它。

:& cd -P "${TMPDIR:-/tmp}" || exit
x=$(((z=($$+$!)/2+1000)-1001))
until mkdir -m a=,u=rwx "work.$0.$((x+=1))" &&
      cd -- "work.$0.$x"
do    [ "$x" -lt "$z" ]    || ! break
done  2>/dev/null          &&
WORK=$PWD exec 9<.

相关内容