Bash 从目录及其子目录中删除所有文件类型

Bash 从目录及其子目录中删除所有文件类型,bash,unix,shell,scripting,Bash,Unix,Shell,Scripting,我的印象是 rm -r *.xml 将从父级和子级删除所有文件,但是: *.xml: No such file or directory 我假设您希望递归地删除所有*.xml文件(在当前和所有子目录中)。为此,请使用: 另一方面,递归删除让我害怕。在我理智的日子里,我倾向于在这一步之前: find . -name "*.xml" (不带-exec位)只是看看在进行跳跃之前可能会删除哪些内容。我建议你也这样做。您的文件将感谢您。rm的手册页上写着: -r, -R, --recursiv

我的印象是

rm -r *.xml
将从父级和子级删除所有文件,但是:

*.xml: No such file or directory

我假设您希望递归地删除所有
*.xml
文件(在当前和所有子目录中)。为此,请使用:


另一方面,递归删除让我害怕。在我理智的日子里,我倾向于在这一步之前:

find . -name "*.xml" 

(不带
-exec
位)只是看看在进行跳跃之前可能会删除哪些内容。我建议你也这样做。您的文件将感谢您。

rm的手册页上写着:

 -r, -R, --recursive
          remove directories and their contents recursively
这意味着标志
-r
需要一个目录。 但是
*.xml
不是目录

如果要递归地从当前目录中删除所有.xml文件,请执行以下命令:

find . -name "*.xml" -type f|xargs rm -f

更漂亮的方式,尽管unix系统不太支持这种方式:

rm -rf */*.xml
这将从当前目录的所有子目录中删除xml文件。

阅读,我刚刚了解了-delete操作:

-delete
          Delete  files; true if removal succeeded.  If the removal failed, an error message is issued.  If -delete fails, find's exit status will be nonzero (when it even‐
          tually exits).  Use of -delete automatically turns on the -depth option.

          Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the start‐
          ing  points  you  specified.   When  testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete implies -depth, you cannot usefully use -prune and -delete together.
资料来源:ManFind

也就是说,您还可以按如下方式递归删除所有xml文件:

find . -name "*.xml" -type f -delete
一个简单的方法是

rm-f*.xml


这将从当前目录中删除所有.xml文件。

ZSH递归全局搜索拯救

调用zsh:
zsh

确保您处于您想要进入的目录中:
cd无论何处

首先列出:
ls**/*.xml

删除:
rm**/*.xml


我将抵制强烈的诱惑,不去抨击
bash
,只需指向相关的zsh文档就可以了。

是的,我想针对几种不同的类型。但是,您的脚本似乎在Bash中不起作用。您不需要逃避
{}
-原始版本很好-OP可能只是打错了。是的,这对我来说很有效,因为我有一堆带有spaceshelpful的文件路径,在删除之前需要注意。无需调用xargs;使用
find-exec
@noa..我知道…在unix中有很多方法可以做类似的事情。这取决于OP选择使用哪种方法。我刚刚给出了我经常使用的方法。@noa实际上
xargs
更有效
-exec
为每个匹配的文件调用
rm
,而
xargs
则分批执行。当有很多文件时,这会产生很大的不同。有趣。这是有道理的。
xargs
如果您使用
-P
选项并行运行任务,对于昂贵的操作可能会更有效,但在这种情况下可能不会有太大的区别。然而,我同意@Rahul的观点,用户喜欢什么取决于他们,人们可以说
find…| xargs…
的语法比
find更容易记住-执行。。。{} \;。(因此+1)这对深度超过2层的目录树有效吗?这应该是投票最多的答案,比管道到xargs容易得多
find . -name "*.xml" -type f -delete