删除目录内容的正确方法

删除目录内容的正确方法

正确的删除方法是什么全部目录的内容,没有说目录?
例如,我有以下目录结构:

foo/
    bar1/
    bar2/
    x.txt

我想删除文件夹bar1bar2文件x.txt不删除 foo

另请考虑带有可能被忽略或引发错误的特殊字符的文件名。


编辑#1(9 月 30 日,18:26 UTC):
我认为我的问题不是重复的这个问题,因为我要求删除一切在目录内,而另一个问题没有,答案也不包含这样的解决方案。

答案1

如果您知道可以使用以下命令之一执行的目录:

$ find foo/* -delete

$ rm -fr foo/*

$ find foo/* -exec rm -fr {} +

如果您的文件以点 ( .) 开头,那么您将需要rm.

$ rm -fr foo/{*,.*}

例子

$ ls -l foo
drwxrwxr-x    6 saml saml  4096 Sep 27 09:43 .
drwx------. 263 saml saml 32768 Sep 27 09:42 ..
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir1
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir2
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir space1
drwxrwxr-x    2 saml saml  4096 Sep 27 09:43 dir space2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 .dot space1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 .dot space2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file2
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file space1
-rw-rw-r--    1 saml saml     0 Sep 27 09:43 file space2

$ rm -fr foo/{*,.*}
rm: cannot remove directory: `adir/.'
rm: cannot remove directory: `adir/..'
$

$ ls -l foo/
total 0
$

使用新的文件目录重复:

$ find foo/* -delete
$

处理特殊字符

如果你有一个名为foo tastic有空格的目录,你可以引用它,但仍然使用通配符:

例子

$ rm -fr "foo tastic"/*

特殊字符

在运行文件名混合物之前,我经常使用这个技巧来查看 shell 对它们的看法。在我上面使用的示例目录中:

$ ls -1 "文件"* 文件空间1 文件空间2

$ ls -1d“dir”* 目录空间1 目录空间2

通过事先进行这些测试,您可以了解使用包含 glob 的命令时将使用哪些文件/目录。

相关内容