Linux 如何删除具有特定名称的所有子目录

Linux 如何删除具有特定名称的所有子目录,linux,bash,shell,gnu-findutils,Linux,Bash,Shell,Gnu Findutils,我在Linux上工作,有一个文件夹,其中包含许多子目录。我需要删除所有具有相同名称的子目录。例如, dir |---subdir1 |---subdir2 | |-----subdir1 |---file 我想删除所有的子目录1。这是我的脚本: find dir -type d -name "subdir1" | while read directory ; do rm -rf $directory done 然而,我执行了它,但似乎什么也没有发生。 我也尝试过fin

我在Linux上工作,有一个文件夹,其中包含许多子目录。我需要删除所有具有相同名称的子目录。例如,

dir
 |---subdir1
 |---subdir2
 |     |-----subdir1
 |---file
我想删除所有的
子目录1
。这是我的脚本:

find dir -type d -name "subdir1" | while read directory ; do
    rm -rf $directory
done
然而,我执行了它,但似乎什么也没有发生。

我也尝试过
find dir-type d“subdir1”-delete
,但仍然没有任何效果。

使用xargs:

find dir -type d  -name "subdir1" -print0 |xargs -0 rm -rf

一些与问题/问题不直接相关的信息:
find | xargs
find-exec


如果
find
找到了正确的目录,那么这些目录应该可以工作:

find dir -type d -name "subdir1" -exec echo rm -rf {} \; 

(有
echo
用于验证命令是否命中所需文件,将其删除以实际运行
rm
并删除目录。)

在读取时连接到
xargs
的管道都有一个缺点,即不寻常的文件名会导致问题。另外,
find-delete
只会尝试删除目录本身,而不会删除其内容。它将在任何非空目录上失败(但您至少应该得到错误)

使用
xargs
,默认情况下,空格分隔单词,因此即使文件名带有空格也不起作用
read
可以处理空格,但在您的命令中,
$tar
的无引号扩展将变量拆分为空格

如果您的文件名没有换行符或尾随空格,这也应该可以:

find ... | while read -r x ; do rm -rf "$x" ; done

从问题来看,您似乎试图使用
查找
。以下替换可能对您有所帮助:

while IFS= read -rd '' dir; do rm -rf "$dir"; done < <(find dir -type d -name "subdir" -print0)

而IFS=read-rd''dir;do rm-rf“$dir”;使用
globstar
选项完成(使用
shopt-s globstar
启用,需要Bash 4.0或更新版本):


与使用
find-exec
find | xargs
相比,此解决方案的缺点是参数列表可能变得太长,但这将需要大量名为
subdir1
的目录。在我的系统上,
ARG_MAX
是2097152。

是否正确列出文件夹。确实如此。将
--delete
更改为
--delete
@TomFenech没有任何更改…您是否验证了您有权删除目录及其所有内容?这正是我要回答的问题。但是考虑<代码>查找-Prtut0和 XARGS—0 <代码>以说明有空格的文件名。它肯定是<代码> -ExcRM- RF 而不是<代码> XARGS(如果您想使用<代码> -F )(需要在这里投票,对不起)@肯特看起来像是写了
xargs vs.exec
博客文章的人错过了使用
-exec ls{}+
@hek2mgl谢谢你的机会。我把这个链接放在了回答中。今天学习了
exec+
,多亏了你的评论。@hek2mgl所以我找到了GNU findutils变更日志,还有
-exec。。。{}+
于2005年添加。那是很久以前的事了,但在我学习shell脚本之后的一段时间:-O.根据我的简单基准测试,使用
\0
管道到xargs稍微快一点,这是有意义的,因为它稍微并行了一些事情,但我同意
-exec。。。{}
看起来更干净。我可以看到来自
echo
的消息,但所有
subdir1
总是在那里。是因为格式问题还是权限问题?
dir
来自Windows系统,有许多不寻常的文件名,例如包含
&
@Yves的文件名,如果您删除echo以实际运行
rm
命令,是否会出现任何错误
find-exec
不应该介意不寻常的文件名,只要系统的其他部分不介意。
while IFS= read -rd '' dir; do rm -rf "$dir"; done < <(find dir -type d -name "subdir" -print0)
rm -rf **/subdir1/