aboutsummaryrefslogtreecommitdiff
path: root/bin/gc
diff options
context:
space:
mode:
Diffstat (limited to 'bin/gc')
-rwxr-xr-xbin/gc150
1 files changed, 150 insertions, 0 deletions
diff --git a/bin/gc b/bin/gc
new file mode 100755
index 0000000..60a6376
--- /dev/null
+++ b/bin/gc
@@ -0,0 +1,150 @@
+#!/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"