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

How to delete all subdirectories with a specific name

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

dir
 |---subdir1
 |---subdir2
 |     |-----subdir1
 |---file

我想删除所有 subdir1。这是我的脚本:

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

一些与question/problem没有直接关系的信息:

find|xargsfind -exec

https://www.everythingcli.org/find-exec-vs-find-xargs/

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

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

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

echo 用于验证命令命中您想要的文件,将其删除到 运行 rm 并删除目录。)

xargswhile read 的管道都有一个缺点,即不寻常的文件名会导致问题。此外,find -delete 只会尝试删除目录本身,而不是它们的内容。它会在任何非空目录上失败(但你至少应该得到错误)。

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

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

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

从问题来看,您似乎已尝试将 whilefind 一起使用。以下替换可能对您有所帮助:

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

使用 globstar 选项(使用 shopt -s globstar 启用,需要 Bash 4.0 或更新版本):

rm -rf **/subdir1/

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