summaryrefslogtreecommitdiff
path: root/dotfiles/system
diff options
context:
space:
mode:
Diffstat (limited to 'dotfiles/system')
-rwxr-xr-xdotfiles/system/.local/bin/dab72
1 files changed, 72 insertions, 0 deletions
diff --git a/dotfiles/system/.local/bin/dab b/dotfiles/system/.local/bin/dab
new file mode 100755
index 0000000..e7d0fae
--- /dev/null
+++ b/dotfiles/system/.local/bin/dab
@@ -0,0 +1,72 @@
+#!/bin/env bash
+# dab - delete all but
+# Craig Jennings <c@cjennings.net>
+# deletes all files in current directory that are NOT of a specific extension
+
+# default switch values
+recurse=""
+del_dirs=""
+
+# help function
+show_help() {
+ echo "Usage: $0 [extension] [OPTION]"
+ echo "Deletes all files that do not match the given extension from the current directory."
+ echo ""
+ echo "Options:"
+ echo "-r Delete files in directories recursively."
+ echo "-d Delete directories if they become empty after deletions."
+ echo "-h Display this help message and exit."
+ echo ""
+ echo "Example: $0 txt -r -d"
+ echo "This would delete all non-text files in the current directory and subdirectories. Any directories emptied by this process will also be deleted."
+ echo ""
+ echo "Note: Directories that were previously empty will remain untouched."
+}
+
+# if help was requested, show it and exit
+if [[ $1 = "-h" ]] || [[ $2 = "-h" ]] || [[ $3 = "-h" ]]; then
+ show_help
+ exit
+fi
+
+# error if nothing or * was passed
+if [[ -z $1 ]] || [[ $1 = "*" ]]; then
+ echo "ERROR: No file extension was provided or invalid extension ('*')."
+ show_help
+ exit
+fi
+
+# identify rest of arguments
+ext=$1
+if [[ $2 == *"-r"* ]] || [[ $3 == *"-r"* ]]; then
+ recurse="-R"
+fi
+
+if [[ $2 == *"-d"* ]] || [[ $3 == *"-d"* ]]; then
+ del_dirs="true"
+fi
+
+# Save empty directories into an array before deleting the files
+empty_dirs=()
+while IFS= read -r -d $'\0'; do
+ empty_dirs+=("$REPLY")
+done < <(find . -type d -empty -print0)
+
+shopt -s globstar nullglob extglob
+
+# remove non-matching files
+for file in **; do
+ if [[ -f "$file" ]] && [[ "$file" != *".$ext" ]]; then
+ rm "$file"
+ fi
+done
+
+# remove directories emptied by this operation
+if [[ $del_dirs == "true" ]]; then
+ for dir in **/; do
+ if [[ ! -n "$(ls -A $dir)" ]] && [[ ! "${empty_dirs[*]}" =~ $dir ]]; then
+ rmdir "$dir"
+ fi
+ done
+fi
+