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

时间:2017-05-09 13:31:07

标签: linux bash shell gnu-findutils

我正在使用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,但仍然没有发生任何事情。

4 个答案:

答案 0 :(得分:4)

如果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

答案 1 :(得分:1)

使用xargs:

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

与问题/问题没有直接关系的一些信息:

find|xargsfind -exec

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

答案 2 :(得分:1)

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

rm -rf **/subdir1/

相比,使用这种方法的缺点find -execfind | xargs是参数列表可能会变得太长,但这需要相当多命名的目录的subdir1。在我的系统上,ARG_MAX是2097152。

答案 3 :(得分:0)

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

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