rm -fr *
不会删除.files
另一方面,
rm -fr * .*
会删除太多!
是否有可靠的方法以递归方式删除Bash中目录的所有内容?
我能想到的一种方式是:
rm -fr $PWD
mkdir $PWD
cd $PWD
这会产生暂时删除$PWD
的副作用。
答案 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 ..?*
我们需要避免使用包含星号的参数来解决此问题。