Copying custom properties from one set of zfs snapshots to another

There was a bug in recent versions of the zfs-for-linux that lead to “zfs send | zfs receive” dropping all your custom properties (such as the ones used by the autosnapshot-tool).

Warning: Since I used it to copy the autosnapshot-labels, I wanted the tool to delete snapshots that were since removed from the source dataset. Be careful!

Use this to copy them over:

#!bash
if [ $# -lt 3 ]; then
        echo Usage: $0 '<PROPERTY>' '<FROM>' '<TO>'
        exit 1
fi

PROPERTY=$1
FROM=$2
TO=$3

zfs list -rH -t snapshot -o $PROPERTY,name -s name $TO | awk '/^-/{print $2;}' | while read snapshot; do
        saveIFS=$IFS
        IFS=@
        set -- $snapshot
        IFS=$saveIFS
        if ! zfs list -H -o name -t snapshot $FROM@$2 > /dev/null 2>&1; then
                echo zfs destroy $snapshot
                zfs destroy $snapshot
        else
                value=$(zfs get -H -o value $PROPERTY $FROM@$2)
                echo zfs set $PROPERTY=$value $snapshot
                zfs set $PROPERTY=$value $snapshot
        fi
done