3

我正在使用 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

4 回答 4

10

如果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
于 2017-05-09T13:40:02.503 回答
3

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

rm -rf **/subdir1/

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

于 2017-05-09T14:22:18.723 回答
2

使用 xargs:

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

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

find|xargs或者find -exec

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

于 2017-05-09T13:35:19.647 回答
0

从问题来看,您似乎已尝试使用whilewith find。以下替换可能会对您有所帮助:

while IFS= read -rd '' dir; do rm -rf "$dir"; done < <(find dir -type d -name "subdir" -print0)
于 2017-05-09T14:02:00.437 回答