我有以下文件(您可能会认为这是列出所有快照的输出zfs list
):
zpzetta/sys/win2012@zfs-auto-snap_daily-2021-03-01-0525 Mon Mar 1 5:25 2021
zpzetta/sys/win2012@zfs-auto-snap_monthly-2021-03-01-0552 Mon Mar 1 5:52 2021
zpzetta/sys/win2012@zfs-auto-snap_daily-2021-03-02-0525 Tue Mar 2 5:25 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-02-2117 Tue Mar 2 21:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-02-2217 Tue Mar 2 22:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-02-2317 Tue Mar 2 23:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0017 Wed Mar 3 0:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0117 Wed Mar 3 1:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0217 Wed Mar 3 2:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0317 Wed Mar 3 3:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0417 Wed Mar 3 4:17 2021
我想删除早于某一天的快照(保留行),例如,早于 3 月 3 日的所有内容。
我知道我可以做类似的事情:
ts=`...` # put in time stamp to compare here
for line in `zfs list -H -rt snap -o name,creation zpzetta`
do
date=`echo $line | awk '{print $2,$3,$4,$5,$6,$7,$8}'`
secs=`date --date='$date' +'%s'`
if [ "$secs" -lt $ts ]
then
echo $line
fi
done
但这对我来说看起来很脏。
难道没有更优雅的方法来做到这一点吗? (作为 shell 脚本,没有 python、perl 等)
答案1
我认为这是一种可能性,它不比较日期,它利用月份的缩写名称以及日期和年份的数字:
$ sed -n '/Mar *[3-9].*2021\|Mar *[1-3][0-9].*2021$/p' foo.foo
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0017 Wed Mar 3 0:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0117 Wed Mar 3 1:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0217 Wed Mar 3 2:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0317 Wed Mar 3 3:17 2021
zpzetta/sys/win2012@zfs-auto-snap_hourly-2021-03-03-0417 Wed Mar 3 4:17 2021
如果需要其他参数,只需更改模式即可。例如,它将检索早于 2020 年 11 月 4 日的行:
sed-n'/十一月*[4-9].*2020年\|十一月*[1-3][0-9].*2020年$/p' foo.foo