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,但仍然没有任何反应。
使用globstar选项(使用 启用shopt -s globstar,需要 Bash 4.0 或更高版本):
rm -rf **/subdir1/
Run Code Online (Sandbox Code Playgroud)
与使用find -execor相比,此解决方案的缺点find | xargs是参数列表可能会变得太长,但这将需要相当多的名为 的目录subdir1。在我的系统上,ARG_MAX是 2097152。
如果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并删除目录。)
这两个管道来xargs和while read有缺点不寻常的文件名会导致一些问题。此外,find -delete将仅尝试删除目录本身,而不删除其内容。它会在任何非空目录上失败(但是您至少应该得到错误)。
使用时xargs,默认情况下,空格分隔单词,因此,即使文件名带有空格也将不起作用。read可以处理空格,但是在您的命令中是$tar,将变量拆分为空格。
如果您的文件名没有换行符或尾随空格,这也应该起作用:
find ... | while read -r x ; do rm -rf "$x" ; done
Run Code Online (Sandbox Code Playgroud)