From c9b232e27d0299a81da42fc074f2fa02fa4bda74 Mon Sep 17 00:00:00 2001 From: Eric Torres Date: Fri, 30 Sep 2022 23:51:49 -0700 Subject: [PATCH] Basic implementation of quickdel --- bash/bin/quickdel.sh | 115 ++++++++++++++++++++++++++++++++----------- 1 file changed, 87 insertions(+), 28 deletions(-) diff --git a/bash/bin/quickdel.sh b/bash/bin/quickdel.sh index 0268e79..6d41127 100755 --- a/bash/bin/quickdel.sh +++ b/bash/bin/quickdel.sh @@ -16,10 +16,15 @@ RED=$'\e[1;31m' GREEN=$'\e[1;32m' BLUE=$'\e[1;34m' YELLOW=$'\e[1;33m' +WHITE_BOLD=$'\e[1;37m' +RESET=$'\e[0;0m' + +declare -a extra_fd_opts +declare typeopt='file' # ========== Helper functions ========== function help() { -cat << HELPMESSAGE + cat << HELPMESSAGE $(basename "$0") $MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION Usage: $(basename "$0") [-h] [-d] [-e] [-E ext] [-f] [-F] [-I] [-i] [-l] patterns [patterns ...] @@ -48,16 +53,22 @@ function color_output() { case "$2" in 'red') printf "$RED%s\n" "$1" - ;; + ;; 'green') printf "$GREEN%s\n" "$1" - ;; + ;; 'blue') printf "$BLUE%s\n" "$1" - ;; + ;; 'yellow') printf "$YELLOW%s\n" "$1" - ;; + ;; + 'white') + printf "$WHITE_BOLD%s\n" "$1" + ;; + 'reset') + printf "$RESET%s\n" "$1" + ;; esac } @@ -65,24 +76,32 @@ function color_output() { function color_path() { if [[ -f "$1" ]]; then color_output "$1" 'blue' - elif [[ -f "$1" ]]; then + elif [[ -d "$1" ]]; then color_output "$1" 'green' fi } +# Delete path using correct command +# Parameters: +# - $1: path +# - $2: force delete boolean flag +function delete() { + exit 1 +} + while true; do case "${1}" in - '-d'|'--directories-only') - DIRECTORIES_ONLY=1 + '-d' | '--directories-only') + typeopt='directory' shift continue ;; - '-e'|'--empty-only') - EMPTY_ONLY=1 + '-e' | '--empty-only') + typeopt='empty' shift continue ;; - '-e'|'--extension') + '-E' | '--extension') EXT="${2}" case "${EXT}" in "") @@ -92,6 +111,7 @@ while true; do exit 1 ;; esac + extra_fd_opts+=('--extension' "$EXT") shift 2 continue ;; @@ -105,35 +125,36 @@ while true; do exit 1 ;; esac + extra_fd_opts+=('--extension' "$EXT") shift continue ;; - '-f'|'--files-only') - FILES_ONLY=1 + '-f' | '--files-only') + typeopt='file' shift continue ;; - '-F'|'--force-directory-delete') - FORCE_DIR_DELETE=1 + '-F' | '--force-directory-delete') + rm_force='--force' shift continue ;; - '-i'|'--no-ignore-vcs') - NO_IGNORE_VCS=1 + '-i' | '--no-ignore-vcs') + extra_fd_opts+=('--no-ignore-vcs') shift continue ;; - '-I'|'--no-ignore') - NO_IGNORE=1 + '-I' | '--no-ignore') + extra_fd_opts+=('--no-ignore') shift continue ;; - '-l'|'--links-only') - FILTER_SYMLINKS=1 + '-l' | '--links-only') + typeopt='symlink' shift continue ;; - '-h'|'--help') + '-h' | '--help') help exit ;; @@ -151,10 +172,48 @@ while true; do esac done -echo 'Script not implemented' -exit 1 +# Interpret options +if [[ -z "$*" ]]; then + echo 'Please enter patterns of filenames to delete' + exit 1 +fi -#for pattern in "$@"; do -# files+= -# exit -#done +declare -a files pattern_results + +for pattern in "$@"; do + readarray -d $'\n' -t pattern_results <<< "$(find_specific "$typeopt" "$pattern" "${extra_fd_opts[@]}")" + files+=("${pattern_results[@]}") +done + +# If nothing was found +if [[ -z "${paths[*]}" ]]; then + color_output 'No files found, exiting' 'yellow' + exit 1 +fi + +# Sort list of paths before printing +readarray -t paths < <(printf '%s\n' "${files[@]}" | sort --unique) + +# Print list of files found matching criteria +i=1 +for p in "${paths[@]}"; do + printf '%s. %s\n' "$(color_output $i 'white')" "$(color_path "$p")" + i=$((i + 1)) +done + +# Padding between files and prompt +#color_output '' reset + +read -r -n 1 -p 'Would you like to delete these files? [y/N]: ' user_response +# Padding between prompt and output +echo '' + +if [[ "$user_response" =~ (y|Y) ]]; then + for p in "${paths[@]}"; do + if [[ -d "$p" ]]; then + rm --recursive "$rm_force" --verbose -- "$p" || printf '%s %s\n' "$(color_output "Unable to remove path:" 'red')" "$(color_path "$p")" + else + rm "$rm_force" --verbose -- "$p" || printf '%s %s\n' "$(color_output "Unable to remove path:" 'red')" "$(color_path "$p")" + fi + done +fi