summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2021-11-08 02:50:58 +0100
committerRobert Günzler <r@gnzler.io>2021-11-08 02:50:58 +0100
commitbea152b0100f4f081fe8a1ccec391ad94b2352ac (patch)
treea40b9ca14c8395f9765caff6c65ec944696a7dc7
parentaa808689f067a8f6bcd24c1a0501809d5a37b806 (diff)
bin: add safe rm
-rwxr-xr-xbin/saferm54
1 files changed, 54 insertions, 0 deletions
diff --git a/bin/saferm b/bin/saferm
new file mode 100755
index 0000000..467fec2
--- /dev/null
+++ b/bin/saferm
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+if [ ! -t 1 ] || [ -n "$UNSAFE_RM" ]; then
+	# shellcheck disable=SC2068
+	exec /bin/rm "$@"
+fi
+
+# stop me from being stupid
+
+OPTIND=0
+for o in "$@"; do
+	OPTIND+=1
+	if [ -d "$o" ] || [ -f "$o" ]; then
+		break
+	fi
+	[ "$o" = "-r" ] && recurse=1
+	[ "$o" = "-f" ] && force=1
+	[ "$o" = "-rf" ] && force=1 && recurse=1
+	[ "$o" = "-h" ] && {
+		printf "usage: saferm\n\n"
+		exit 0
+	}
+done
+
+if [ -n "${force}" ] && [ -n "${recurse}" ]; then
+	tput setaf 1
+	(
+		echo "!"
+		echo "!" "recursive force not allowed"
+		echo "!"
+	) >&2
+	tput sgr0
+	exit 1
+fi
+
+tput setaf 1
+(
+	for ((idx = OPTIND; idx <= $#; idx++)); do
+		if [ -d "${!idx}" ]; then
+			exa --color=never --all --tree "${!idx}" >&2
+			echo "!"
+			echo "!" "$(du -sh "${!idx}")"
+			echo "!" "$(fd --no-ignore --type file . "${!idx}" | wc -l)" "files"
+			echo "!" "$(fd --no-ignore --type directory . "${!idx}" | wc -l)" "directories"
+			echo "!"
+		else
+			echo "${!idx}"
+		fi
+	done
+) >&2
+tput sgr0
+
+# shellcheck disable=SC2068
+exec /bin/rm -I --one-file-system "$@"