当我启动单用户模式并列出我感兴趣的 ZFS 快照时,我想恢复到“xfcedesktop”快照。但是,这需要我zfs rollback snapshotname@xfcedesktop
为每个快照手动输入命令,如下所示:
# zfs list -t snapshot -o name | grep xfcedesktop
zroot@xfcedesktop
zroot/ROOT@xfcedesktop
zroot/ROOT/default@xfcedesktop
zroot/home@xfcedesktop
zroot/home/zoliky@xfcedesktop
zroot/tmp@xfcedesktop
zroot/usr@xfcedesktop
zroot/usr/ports@xfcedesktop
zroot/usr/src@xfcedesktop
zroot/var@xfcedesktop
zroot/var/audit@xfcedesktop
zroot/var/crash@xfcedesktop
zroot/var/log@xfcedesktop
zroot/var/mail@xfcedesktop
zroot/var/tmp@xfcedesktop
# now I need to type this for each line:
zfs rollback zroot@xfcedesktop
zfs rollback zroot/ROOT@xfcedesktop
zfs rollback zroot/ROOT/default@xfcedesktop
.. and so on
这很耗时,而且容易出错。我想知道是否有一个 shell 技巧或一行代码可以让我循环遍历 grep 的输出并执行每个快照的回滚命令。我在 FreeBSD 上使用 sh(不是 bash),以单用户模式运行。理想情况下,我希望它是一行代码而不是脚本。
使用简单
while
循环,例如...或使用
xargs
-r
在 FreeBSD 上支持但不需要选项。xargs
对于 GNU 的xargs
,如果输入为空,则该选项会阻止实用程序尝试运行该实用程序。这是 FreeBSD 的 的默认行为xargs
。我还更加小心地使用正则表达式,
grep
以确保我们只获得预期的快照(以 结尾的快照@xfcedesktop
)。这不是复制粘贴 - 删除
##
到行尾。我正在使用##
注释来解释。echo
当您对输出满意时,删除该命令。awk
这两种解决方案都有积极的一面。而且,我在批量处理大量 ZFS 文件系统或快照时通常使用非常简单的命令。结合明智地使用以及在执行命令之前
-Ho name
“三思而后行”的方法,我建议:echo
如果您喜欢看到的命令,请向上箭头至该命令并添加
| sh
以执行该zfs rollback
命令。