Following up on Removing old ZFS snapshots, I had way too many snapshots and while I knew some datasets that had too many, I wasn't clear how to find datasets with way to many snapshots that I had to delete.
zfs list -t snapshot -o name -s name -r nas resulted in tens of thousands of results I couldn't scroll through. And I wanted to be cautious where I ran zfs destroy on snapshots!
So I decided to create a series of commands that let me count the number of snapshots each dataset has and sort them!
These commands will find all snapshots within the pool
tank and count them by dataset
zfs list -t snapshot -o name -s name -r tank | sed 's/@.*//' | sort | uniq -c | sort
While those are sorted in ascending order, that works nice for me in the terminal. If you prefer just the top datasets in descending order just reverse the final sort and pipe to head!
zfs list -t snapshot -o name -s name -r tank | sed 's/@.*//' | sort | uniq -c | sort -r | head
Warning, this should not be piped to
xargs, or anything like that. Here
sed removes the snapshot name leaving just the dataset name.