在 bash 脚本中,我如何优雅地检查特定位置是否是 btrfs 子卷?
我不想知道给定位置是否在btrfs 文件系统(或子卷)中。我想知道给定位置是否是。
理想情况下,解决方案可以用 bash 函数编写,因此我可以编写:
if is_btrfs_subvolume $LOCATION; then
# ... stuff ...
fi
一个“优雅”的解决方案将是可读的、代码少、资源消耗少。
子卷由 inode 编号 256 标识,因此您可以通过以下方式简单地检查它
if [ `stat --format=%i /path` -eq 256 ]; then ...; fi
还有一个所谓的空子卷,即。如果对嵌套子卷进行快照,则该实体将代替原始子卷存在。它的 inode 编号为 2。
对于任何目录是否是子卷的一般可靠检查,还应验证文件系统类型
stat -f --format=%T /path
解决方案1:使用@kdave 建议:
is_btrfs_subvolume() {
local dir=$1
[ "$(stat -f --format="%T" "$dir")" == "btrfs" ] || return 1
inode="$(stat --format="%i" "$dir")"
case "$inode" in
2|256)
return 0;;
*)
return 1;;
esac
}
解决方案2:我之前使用的(只有一个电话,但可能很脆弱):
is_btrfs_subvolume() {
btrfs subvolume show "$1" >/dev/null 2>&1
}
编辑:更正并替换list
为在任何正常目录上都不会正确回答show
的行为。list
btrfs
EDIT2:由于@kdave 没有发布他出色答案的完整版本,我将其添加到我的答案中。