如何可靠地rm -fr *?

时间:2017-03-25 19:26:10

标签: bash rm glob dotfiles

rm -fr *

不会删除.files

另一方面,

rm -fr * .*

会删除太多!

是否有可靠的方法以递归方式删除Bash中目录的所有内容?

我能想到的一种方式是:

rm -fr $PWD
mkdir $PWD
cd $PWD

这会产生暂时删除$PWD的副作用。

4 个答案:

答案 0 :(得分:5)

我建议先使用:

shopt -s dotglob
  

dotglob:如果设置,则bash包含以路径名扩展结果中的.开头的文件名

答案 1 :(得分:1)

rm -fr * .*

相对“安全”。 POSIX禁止rm...采取行动。

rm -rf . .. 

将是一个无操作,但它将返回1.如果你不想返回错误,你可以这样做:

rm -rf .[!.]* 

这是POSIX标准化,不需要bash扩展。

您也可以使用find:

find . -delete 

答案 2 :(得分:1)

您可以将find-delete-maxdepth

一起使用
find . -name "*" -delete -maxdepth 2

因此,假设您位于temp目录中,如下所示:

./temp
     |_____dir1
     |        |_____subdir1
    X|_file  X|_file      |_file
     |
    X|_____dir2
             X|_file

查看树,使用上面的命令删除其旁边有 X 的文件和目录。 subdir1可以省略,因为find将删除文件的最大深度设置为2,并且有一个文件驻留在其中。 find将删除以.开头的文件 - 但是,它不适用于符号链接。

 -delete
         Delete found files and/or directories.  Always returns true.
         This executes from the current working directory as find recurses
         down the tree. It will not attempt to delete a filename with a
         ``/'' character in its pathname relative to ``.'' for security
         reasons. Depth-first traversal processing is implied by this
         option. Following symlinks is incompatible with this option.

答案 3 :(得分:1)

UNIX的常用智慧是使用类似的东西:

rm -rf * .[!.]* ..?*

这将列出所有以点或甚至双点开头的文件(不包括普通双点(./..)。

但如果不存在该类型的文件,那么全局扩展将保留星号。

让我们测试一下:

$ mkdir temp5; cd temp5
$ touch {,.,..}{aa,bb,cc}
$ echo $(find .)
. ./aa ./cc ./..bb ./..aa ./.cc ./.bb ./..cc ./.aa ./bb

并且,如上所示,这将包括所有文件:

$ echo * .[!.]* ..?*
aa bb cc .aa .bb .cc ..aa ..bb ..cc

但如果其中一种类型不存在,则星号将保留:

$ rm ..?*
$ echo * .[!.]* ..?*
aa bb cc .aa .bb .cc ..?*

我们需要避免使用包含星号的参数来解决此问题。