我经常使用绑定挂载来帮助在多个位置提供空间,而不必拥有多个逻辑卷/物理分区/ LUN 等。
例如,我可能在 处挂载了一个 200G LV 。从那里,我将创建像和这样的/space
子目录,然后分别将它们绑定到和。var_opt
var_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 .
。