使用 rm --one-file-system 仅删除本地文件系统上的文件

使用 rm --one-file-system 仅删除本地文件系统上的文件

我有一个位于 的 FUSE 安装/media/writable,但是,有时此 FUSE 安装会断开连接,但某些程序仍会尝试写入/media/writable

当我重新启动FUSE挂载服务时,由于目录非空,它将无法挂载。

我如何使用rm--one-file-system参数来确保当我 rm 时/media/writable,它只会删除位于当地的文件系统,而不是保险丝安装文件系统?其中还有其他文件夹,/media/因此我无法rm在父文件夹中运行。

我是否最好将文件夹向下移动一层(例如/media/writable/mount),以便我可以 rm 父文件夹,或者有没有办法选择我希望从中删除的文件系统?

我正在运行带有 coreutils 8.28 的 Ubuntu 18.04.1 LTS。

编辑:我当前的方法是这样的,但我想看看是否有更好的方法: ExecStartPre=-/bin/mountpoint /media/writable/ || /usr/bin/stat /media/writable/MOUNTED || /bin/rm/ --one-file-system -rf /media/writable/*

答案1

一种方法是cd进入该目录。那么,即使在运行清理脚本时正在挂载该目录,您仍然会看到旧的本地目录(只要您仅使用相对路径)。

#! /bin/zsh -
zmodload zsh/stat || exit
cd /media/writable || exit

stat -H parent .. || exit
stat -H here   .  || exit

if (( parent[device] == here[device] )); then
  # current directory is on the same device as parent
  all_files=(*(ND))
  (( $#files == 0 )) ||
    rm -rf --one-file-system --preserve-root=all -- $all_files
fi

请注意Dglob 限定符还可以删除隐藏文件,并且--preserve-root=all作为 的补充,--one-file-system以防其中一些文件$all_files本身是某些其他文件系统的挂载点(尽管在当前的实现中,这个似乎并不是无竞争的,所以我会避免rm -rf --one-file-system --preserve-root=all /media/writable)。

这仍然可能会失败“参数列表太长”如果那里有大量文件,则会出现错误,您可以通过编写它来解决此问题:

print -rNC1 -- $all_files |
  xargs -r0 rm -rf --one-file-system --preserve-root=all --

相关内容