运行 `rm -rf` 时,是否可以排除某些子目录?

war*_*ren 8 mount bash exclude recursion disk-cleanup

我经常使用绑定挂载来帮助在多个位置提供可用空间,而不必拥有多个逻辑卷/物理分区/LUN 等。

例如,我可能有一个 200G LV 安装在/space. 从那里,我将创建子目录 like var_optand var_log,然后我可以将 mount分别绑定到/var/opt/var/log

在“空间”目录上进行清理时,是否可以从正在运行的内部排除目录?rm -rf/space

例子:

# pwd
/space
# rm -rf * {except-for-var_opt-and-var_log}
Run Code Online (Sandbox Code Playgroud)

是否有不同或更好(但同样简单)的方法来完成我没有想到的我正在尝试做的事情?

Gil*_*il' 14

概念简单,出错风险低:

mkdir TO_DELETE
mv * TO_DELETE
mv TO_DELETE/var_opt TO_DELETE/var_log .
rm -rf TO_DELETE
Run Code Online (Sandbox Code Playgroud)

忽略mv关于移动TO_DELETE到自身子目录的错误。

您还可以使用 ksh 的扩展 glob:

rm -rf !(var_opt|var_log)
Run Code Online (Sandbox Code Playgroud)

如果您启用它们,这些也可以在 bash 中使用:

shopt -s extglob
rm -rf !(var_opt|var_log)
Run Code Online (Sandbox Code Playgroud)

在 zsh 中同上:

setopt ksh_glob
rm -rf !(var_opt|var_log)
Run Code Online (Sandbox Code Playgroud)

Zsh 也有自己的扩展 globs:

setopt extended_glob
rm -rf ^var_(opt|log)
Run Code Online (Sandbox Code Playgroud)


Jan*_*nen 3

也许与 find + xargs + rm 组合?

find /space ! -iregex '(var_opt|var_log)' | xargs rm -f

或那种曲调的东西。当然,在将其更改为 rm 之前,首先指示 xargs 执行一些更无害的操作(例如 echo)可能是明智的...

  • **不要使用 xargs** (除了 `-0`)!它期望输入以一种非常特殊的方式引用,而“find”不会生成。因此,如果文件名包含空格或 `\'"`,此命令将严重失败。相反,请使用 `-exec`:find /space ! -iregex '(var_opt|var_log)' -exec rm {} +`。或者因为 `-iregex` 是 GNU find 所特有的,所以请使用它的 `-delete` 操作:`find /space ! -iregex '(var_opt|var_log)' -delete`。 (7认同)