Go to file
Dave Eddy eb9351b711 bump version in code 2022-06-17 02:12:02 -04:00
man clean up docs, add docs for `-l` 2021-11-30 23:05:41 -05:00
CHANGES.md validate datasets exist before running 2022-06-12 15:05:07 -04:00
LICENSE add LICENSE file 2018-11-12 13:07:51 -05:00
Makefile allow passing $(DESTDIR) 2018-11-12 21:34:57 +01:00
README.md clean up docs, add docs for `-l` 2021-11-30 23:05:41 -05:00
zfs-prune-snapshots bump version in code 2022-06-17 02:12:02 -04:00

README.md

ZFS Prune Snapshots

Remove snapshots from one or more zpools that match given criteria

Examples

Remove snapshots older than a week across all zpools

zfs-prune-snapshots 1w

Same as above, but with increased verbosity and without actually deleting any snapshots (dry-run)

zfs-prune-snapshots -vn 1w

Remove snapshots older than 3 weeks on tank1 and tank2/backup. Note that this script will recurse through all of tank1 and all datasets below tank2/backup

zfs-prune-snapshots 3w tank1 tank2/backup

Remove snapshots older than a month on the zones pool that start with the string "autosnap_"

zfs-prune-snapshots -p 'autosnap_' 1M zones

Remove snapshots older than two months on the tank pool that end with the string "_frequent"

zfs-prune-snapshots -s '_frequent' 2M tank

Remove snapshots older than a month on the zones pool that do not start with the string "autosnap_"

zfs-prune-snapshots -i -p 'autosnap_' 1M zones

Timespec

The first argument denotes how old a snapshot must be for it to be considered for deletion - possible specifiers are

  • s seconds
  • m minutes
  • h hours
  • d days
  • w weeks
  • M months
  • y years

Usage

usage: zfs-prune-snapshots [-hnliqRvV] [-p <prefix>] [-s <suffix>] <time> [[dataset1] ...]

remove snapshots from one or more zpools that match given criteria

examples
    # zfs-prune-snapshots 1w
    remove snapshots older than a week across all zpools

    # zfs-prune-snapshots -vn 1w
    same as above, but with increased verbosity and without
    actually deleting any snapshots (dry-run)

    # zfs-prune-snapshots 3w tank1 tank2/backup
    remove snapshots older than 3 weeks on tank1 and tank2/backup.
    note that this script will recurse through *all* of tank1 and
    *all* datasets below tank2/backup

    # zfs-prune-snapshots -p 'autosnap_' 1M zones
    remove snapshots older than a month on the zones pool that start
    with the string "autosnap_"

    # zfs-prune-snapshots -s '_frequent' 2M tank
    remove snapshots older than two months on the tank pool that end
    with the string "_frequent"

    # zfs-prune-snapshots -i -p 'autosnap_' 1M zones
    remove snapshots older than a month on the zones pool that do not
    start with the string "autosnap_"

timespec
    the first argument denotes how old a snapshot must be for it to
    be considered for deletion - possible specifiers are

        s seconds
        m minutes
        h hours
        d days
        w weeks
        M months
        y years

options
    -h             print this message and exit
    -n             dry-run, don't actually delete snapshots
    -l             list only mode, just list matching snapshots names
                   without deleting (like dry-run mode with machine-parseable output)
    -p <prefix>    snapshot prefix string to match
    -s <suffix>    snapshot suffix string to match
    -i             invert matching of prefix and suffix
    -q             quiet, do not printout removed snapshots
    -R             recursively delete, pass '-R' directly to 'zfs destroy'
    -v             increase verbosity
    -V             print the version number and exit

Development Notes

Style

shellcheck is used to check bash style. Use make check to run the style checker:

$ make check
awk 'length($0) > 80 { exit(1); }' zfs-prune-snapshots
shellcheck zfs-prune-snapshots

Bash style guide: https://www.daveeddy.com/bash/

Manpage

Use make man to regenerate the manpage:

$ make man
md2man-roff man/zfs-prune-snapshots.md > man/zfs-prune-snapshots.1
$ ./man/zfs-prune-snapshots.1
<man page opens>

Manpages are generated with md2man which requires ruby-devel to be installed. Once ruby is installed, md2man can be installed locally with:

$ gem install --user-install md2man

License

MIT License