#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: gc [TYPE] gc -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message TYPE what to do GC on (default: all): - guix - nohup - trash - tmpdir - docker - email - vcs Free disk space system-wide. Examples: Just run it, for all: $ gc Cleanup tmpdir: $ gc tmpdir EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) disk() { df -h . | awk 'NR == 2 { printf "%s - %s/%s\n", $4, $3, $2 }' } gc_guix() { pass show velhinho/0-andreh-password | head -n1 | sudo -iS guix system delete-generations pass show velhinho/0-andreh-password | head -n1 | sudo -iS guix gc --optimize -d guix home delete-generations guix gc --optimize -d } gc_nohup() { find ~/ -type f -name 'nohup.out' -exec rm -vf "{}" \; } gc_trash() { yes | trash-empty } gc_tmpdir() { find "${TMPDIR:-/tmp}" -type f -atime +10 -exec rm -vf "{}" \; ||: } gc_docker() { if command -v docker; then yes | docker system prune -a docker rmi "$(docker images -a -q)" ||: docker rm "$(docker ps -a -f status=exited -q)" ||: docker stop "$(docker ps -a -q)" ||: docker rm "$(docker ps -a -q)" ||: yes | docker volume prune yes | docker container prune fi } gc_email() { notmuch search --output=files --exclude=false tag:killed | xargs -I{} rm -vf "{}" } gc_vcs() { repos -e ~/dev/go/ -e ~/dev/quicklisp/ -e ~/dev/archive/ ~/dev/ | xargs -I% -P4 x vcs -C% gc OR true } gc_all() { set -x gc_guix gc_nohup gc_trash gc_tmpdir gc_docker gc_email gc_vcs set +x } TYPE="${1:-all}" CMD=gc_"$TYPE" if ! command -v "$CMD" >/dev/null; then printf 'Invalid TYPE: "%s".\n\n' "$TYPE" >&2 usage >&2 exit 2 fi BEFORE="$(disk)" "$CMD" AFTER="$(disk)" printf 'Disk space:\n' printf ' before: %s\n' "$BEFORE" printf ' after: %s\n' "$AFTER"