我有一个位于 的 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
请注意D
glob 限定符还可以删除隐藏文件,并且--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 --