如果目录已为空,则删除目录中的文件而不会出错


31

作为部署脚本的一部分,我想从temp目录中转储一些缓存的内容。我使用如下命令:

rm /tmp/our_cache/*

但是,如果/tmp/our_cache为空(将许多更改快速连续推送到我们的测试服务器时,这很常见),则会显示以下错误消息:

rm: cannot remove `/tmp/our_cache/*': No such file or directory

没什么大不了的,但是这有点丑陋,我想降低此脚本输出中的信噪比。

在UNIX中删除目录内容而不收到提示该目录已为空的消息的简洁方法是什么?

Answers:


48

由于您可能想删除所有文件而没有提示,为什么不使用-f开关rm忽略不存在的文件呢?

rm -f /tmp/our_cache/*

从手册页:

-f, --force
          ignore nonexistent files, never prompt

另外,如果其中包含任何子目录,/tmp/our_cache/并且您也希望删除这些子目录及其内容,请不要忘记进行-r切换。


3
最明显的解决方案,我没有考虑过!我觉得这是xkcd.com/399漫画中的第一个人;-)
惠更斯(Huygens)

6
find /tmp/our_cache/ -mindepth 1 -delete

编辑1

删除“ -f

编辑2

添加了非标准选项-mindepth 1,以防止删除搜索根目录(取消-type f限制后)。


请注意,-type f由于可能还有临时目录(尽管问题中的示例并未说明它们,所以它们可能不存在,我还是会省略它们)
Izkata 2013年

1
使用-type f只会删除常规文件,因此不会删除符号链接。
惠更斯州2013年

@rush很抱歉,我没有检查,只是看了手册页上的“删除文件”,无论如何都没有提到目录。我删除我的评论。
Hauke Laging 2013年

1
这样就删除了,/tmp/our_cache所以您也可以这样做rm -r /tmp/our_cache。在使用非标准选项时,可以使用-mindepth 1。请注意,与相反rm /tmp/our_cache/*,它还会删除子目录及其内容和隐藏文件。
斯特凡Chazelas

2

您可以将标准错误重定向到,/dev/null这样它就不会打印此错误

$  rm /tmp/our_cache/* 2>/dev/null

2
如果文件因为正在使用而无法删除,这是否也可以抑制显示的错误?我要抑制的唯一错误是目标目录为空时显示的错误。这似乎会产生不良的副作用。
Mark Amery 2013年

即使您尝试删除某些已打开进程的文件,也不会出现错误。
pradeepchhetri

1

另一种方式(尽管有点过大...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

这用于test[测试ls在目录上运行时返回的字符串是否为空。然后,当且仅当该字符串不为空时,它才会删除目录中的所有内容。

注意:将glob排除在外ls将抑制没有文件的错误。


-1

如果您的脚本是BASH中的us,则可以尝试:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

如果存在“实际”问题或文件受到保护(这样做将需要使用的-f修饰符rm以删除这种类型的文件),这样做仍将产生错误,但是当没有文件存在时将避免该错误。

如果您在脚本编写中使用的不是BASH,而是使用其他Shell,例如zsh,ksh,则可以尝试使用其他语法,该语法可能更便于移植:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.