在bash脚本中,如果特定位置是btrfs子卷,我怎么能优雅地检查?
我不想知道给定位置是在 btrfs文件系统(或子卷)中。我想知道给定的位置是子体积的头部。
理想情况下,解决方案可以用bash函数编写,所以我可以写:
if is_btrfs_subvolume $LOCATION; then
# ... stuff ...
fi
优雅'解决方案是可读的,代码小,资源消耗小。
答案 0 :(得分:10)
子卷由inode编号256标识,因此您可以通过
进行检查if [ `stat --format=%i /path` -eq 256 ]; then ...; fi
还有一个所谓的空子体积,即。如果嵌套的子卷被快照,则该实体将代替原始子卷存在。其inode数为2。
对于通常可靠的检查,任何目录都是子卷,还应验证文件系统类型
stat -f --format=%T /path
答案 1 :(得分:3)
解决方案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
目录上正确回答。< / p>
EDIT2:由于@kdave没有发布他的高级答案的完整版本,我将其添加到我的答案中。