如何删除具有特定名称的所有子目录
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|xargs
或 find -exec
如果 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
从问题来看,您似乎已尝试将 while
与 find
一起使用。以下替换可能对您有所帮助:
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 -exec
或 find | xargs
相比,此解决方案的缺点是参数列表可能变得太长,但这将需要很多名为 subdir1
的目录.在我的系统上,ARG_MAX
是 2097152。
我正在处理 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|xargs
或 find -exec
如果 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
从问题来看,您似乎已尝试将 while
与 find
一起使用。以下替换可能对您有所帮助:
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 -exec
或 find | xargs
相比,此解决方案的缺点是参数列表可能变得太长,但这将需要很多名为 subdir1
的目录.在我的系统上,ARG_MAX
是 2097152。