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

Yve*_*ves 2 linux bash shell gnu-findutils

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

dir
 |---subdir1
 |---subdir2
 |     |-----subdir1
 |---file
Run Code Online (Sandbox Code Playgroud)

我要删除全部subdir1。这是我的脚本:

find dir -type d -name "subdir1" | while read directory ; do
    rm -rf $directory
done
Run Code Online (Sandbox Code Playgroud)

但是,我执行了它,但是似乎什么也没发生。

我也尝试过find dir -type d "subdir1" -delete,但仍然没有任何反应。

Ben*_* W. 6

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

rm -rf **/subdir1/
Run Code Online (Sandbox Code Playgroud)

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


ilk*_*chu 5

如果find根本找不到正确的目录,则它们应该起作用:

find dir -type d -name "subdir1" -exec echo rm -rf {} \; 
Run Code Online (Sandbox Code Playgroud)

要么

find dir -type d -name "subdir1" -exec echo rm -rf {} +
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

find ... | while read -r x ; do rm -rf "$x" ; done
Run Code Online (Sandbox Code Playgroud)