我正在尝试使用以下方法删除某些目录的内容(但不是目录本身):
find -type d -name someDirs -exec rm -rf {}/* \;
Run Code Online (Sandbox Code Playgroud)
但它不起作用。有小费吗?
小智 9
您可以将目录(或目录)作为参数提供给find
并告诉它使用选项跳过它-mindepth
:
-mindepth 级别
不要在低于级别(非负整数)的级别应用任何测试或操作。
-mindepth 1 表示处理除命令行参数之外的所有文件。
所以,你的命令是:
find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+
Run Code Online (Sandbox Code Playgroud)
find . -type f -delete
Run Code Online (Sandbox Code Playgroud)
将删除当前目录中及以下的所有文件,保留目录结构。
如果您的 find 命令不支持 -delete (它有点现代,但已经存在几年了),那么:
find . -type f -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)
编辑:正如 Nate 所指出的,这不是正确的答案。
您的命令的问题在于通配符扩展是在实际调用命令之前由您的 shell 完成的。由于您的 shell 没有找到匹配的文件{}/*
(因为您{}
在当前目录中没有具有文字名称的目录),因此将*
其传递给命令不变,然后将修改该命令find
以删除*
您的文件中名为文字的文件someDirs
目录,因为该rm
命令不会(再次)扩展通配符。您可以通过运行“调试”它
find -type d -name someDirs -exec echo rm -rf {}/* \;
Run Code Online (Sandbox Code Playgroud)
反而。为了确保 shell 有机会扩展您的*
,让我们exec
生成另一个可以扩展的 shell *
(并保护命令不被首先用单引号扩展),如下所示:
find -type d -name someDirs -exec sh -c 'rm -rf {}/*' \;
Run Code Online (Sandbox Code Playgroud)
或像这样测试:
find -type d -name someDirs -exec sh -c 'echo rm -rf {}/*' \;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4157 次 |
最近记录: |