2014-10-20 89 views
0

是否有一些优雅/简单的方式来删除文件夹的内容,这种方式没有错误输出,如果它是空的?在bash中截断一个目录

下面的命令,如果该目录是空的,在这种情况下

$ rm -r $dir/* 

不起作用,因为,在wilcard *没有展开,你会得到一个错误,指出rm找不到文件*

当然,标准的方法是检查它是否为空(使用ls $dir | wc -wfind $dir -link 2或任何其他相关命令),否则删除其内容。

是否有其他方法不检查文件夹内容,而只是“截断”目录呢?

回答

5

猛砸

简单,

$ rm -rf dir/* 

(默认情况下,我相信)猛砸不抱怨没有找到任何与glob相关的东西。

$ echo dir/* 
dir/* 

rm没有找到有文字的glob字符的文件名,它抱怨找不到它被要求删除的文件:

$ rm "dir/*" 
rm: cannot remove ‘dir/*’: No such file or directory 
$ echo $? 
1 
它只是通过给你的命令传递你的文字水珠

但是,如果你强迫它,它不会抱怨:

$ rm -f "dir/*" 
$ echo $? 
0 

我不知道这是否副歌 - 从 - 抱怨是POSIX。

但是,请注意,如果您没有设置shell选项“dotglob”,则会漏掉以点开头的文件,也就是“hidden”文件。

一般

岩组不通过默认传递文字水珠。你必须要求“set -o nonomatch”。

$ echo dir/* 
zsh: no matches found: dir/* 
$ echo $? 
1 
$ set -o nonomatch 
$ echo dir/* 
dir/* 

出于兼容性考虑,我不会用上面的现代猛砸专用“rm -rf dir/*”,但将使用更普遍的,广泛兼容的解决方案:

$ find dir -mindepth 1 -delete 

查找所有文件“目录“的最小深度为1(”目录“本身在深度为0),并删除它们。

3

您可以使用rm -rf

rm -rf "$dir"/* 

man bash

-f, --force 
      ignore nonexistent files and arguments, never prompt 
+1

...我提出的问题太快了。明显的解决方案。谢谢。 – 2014-10-20 17:50:14