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

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

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

例如,我可能在 处挂载了一个 200G LV 。从那里,我将创建像和这样的/space子目录,然后分别将它们绑定到和。var_optvar_log/var/opt/var/log

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

例子:

# pwd
/space
# rm -rf * {except-for-var_opt-and-var_log}

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

答案1

也许可以使用 find + xargs + rm 组合?

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

或者该曲调中的其他内容。当然,在将其更改为 rm 之前,最好先指示 xargs 执行一些更无害的操作(例如 echo)...

答案2

概念上简单,错误风险低:

mkdir TO_DELETE
mv * TO_DELETE
mv TO_DELETE/var_opt TO_DELETE/var_log .
rm -rf TO_DELETE

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

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

rm -rf !(var_opt|var_log)

如果你启用它们,它们在 bash 中也可用:

shopt -s extglob
rm -rf !(var_opt|var_log)

在 zsh 中同样如此:

setopt ksh_glob
rm -rf !(var_opt|var_log)

Zsh 也有自己的扩展 glob:

setopt extended_glob
rm -rf ^var_(opt|log)

答案3

另外一个选择:

检查输出

env ls -d -1 space/* | grep -E -v 'var_opt|var_log'

如果这看起来像您想要删除的文件/文件夹列表,请使用

env ls -d -1 space/* | grep -E -v 'var_opt|var_log' | xargs rm -rf

我建议使用env ls而不是来禁用shell 中ls的任何别名。ls

答案4

如果您想要保留的目录恰好是挂载点,您可能能够--one-file-system在 GNU 中使用rm

我还没有研究过这是如何实现的,但我猜测如果绑定挂载来自同一个文件系统内部,那么这将不会按照你想要的方式进行,所以要小心! rm没有--no-act选项,但你可以使用管道yes no | rm -ir .

相关内容