我正在使用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
,但仍然没有发生任何事情。
答案 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
并删除目录。)
xargs
和while 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|xargs
或find -exec
答案 2 :(得分:1)
使用globstar
选项(使用shopt -s globstar
启用,需要Bash 4.0或更高版本):
rm -rf **/subdir1/
相比,使用这种方法的缺点find -exec
或find | xargs
是参数列表可能会变得太长,但这需要相当多命名的目录的subdir1
。在我的系统上,ARG_MAX
是2097152。
答案 3 :(得分:0)
从问题来看,您似乎已尝试将while
与find
一起使用。以下替换可能对您有所帮助:
while IFS= read -rd '' dir; do rm -rf "$dir"; done < <(find dir -type d -name "subdir" -print0)