ZFS Clone Snapshots

The following script clones a zfs dataset with all available snapshots. The variable source=${1} defines the source dataset, dest=${2} defines the destination dataset. The destination dataset must be created in advanced manually.

 1| #!/bin/bash
 2| 
 3| source=${1}
 4| source_mountpoint=$(/usr/sbin/zfs get mountpoint -o value -H ${source})
 5| source_snappath=${source_mountpoint}/.zfs/snapshot
 6| dest=${2}
 7| dest_mountpoint=$(/usr/sbin/zfs get mountpoint -o value -H ${dest})
 8| 
 9| snaps=(${source_snappath}/*)
10| 
11| IFS=$'\n' snaps=($(sort <<<"${snaps[*]}"))
12| unset IFS
13| 
14| for f in "${snaps[@]}"; do
15|    echo "Copy $f"
16|    snapname=$(basename "$f")
17|    /usr/bin/rsync -a --progress --delete ${f}/ ${dest_mountpoint}
18|    /usr/sbin/zfs snapshot ${dest}@${snapname}
19|    echo "-------------------------------------------------"
20| done