#!/bin/sh IFS=' ' days=${1:-7} types=${2:-ext2,ext3,ext4,xfs,btrfs,vfat,nfs} getfsroot() { printf "%s" "$(df "$1" --output=target | tail -1)" } list_trash_dirs() { for mnt in $(findmnt -Py -t "$types"); do eval "$mnt" # shellcheck disable=2153 if [ "$TARGET" = "$(getfsroot "${XDG_DATA_HOME:-$HOME/.local/share}")" ]; then target=${XDG_DATA_HOME:-$HOME/.local/share}/Trash elif [ "$TARGET" = "/" ]; then target=/.Trash else target=${TARGET}/.Trash fi [ -w "$target" ] && { echo "$target"; return; } echo done } prune() { [ -w "$1" ] || return 1 for file in "$1"/files/*; do file=$(basename "$file") [ "$file" = '*' ] && return if [ ! -r "$1/info/$file" ] || [ ! "$(head -1 "$1/info/$file")" = "[Trash Info]" ]; then [ -w "$1/info/$file" ] && rm -rf "$1/info/$file" rm -rf "$1/files/$file" continue fi if [ "$(date -ud "$days days ago" +%s)" -gt "$(date -ud "$(grep DeletionDate "$1/info/$file" | cut -d '=' -f2)" +%s)" ]; then echo "$file too old!" rm -rf "$1/info/$file" rm -rf "$1/files/$file" fi done } for dir in $(list_trash_dirs); do prune "$dir" || echo "Failed to prune $dir" done