2018-11-15 06:49:53 -08:00
|
|
|
#!/bin/bash
|
2018-10-13 13:06:23 -07:00
|
|
|
# quickdel - delete any file matching a query
|
|
|
|
# Dependencies:
|
2018-10-22 10:36:17 -07:00
|
|
|
# fd
|
2018-10-13 13:06:23 -07:00
|
|
|
|
|
|
|
printHelp() {
|
|
|
|
cat << EOF
|
|
|
|
Fuzzy find and delete files matching patterns
|
|
|
|
|
|
|
|
Usage: quickdel [-h] [-i] [-I] [patterns]
|
|
|
|
|
|
|
|
Options:
|
|
|
|
-d, --directories-only only delete directories
|
|
|
|
-h, --help print this help page
|
|
|
|
-i, --no-ignore do not ignore .gitignore and .fdignore
|
|
|
|
-I, --no--ignore-vcs do not ignore .gitignore
|
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
# Pre-run correctness checks
|
|
|
|
unset files
|
|
|
|
unset fd_opts
|
|
|
|
ans=
|
|
|
|
|
|
|
|
declare -a files
|
|
|
|
declare -a fd_opts
|
|
|
|
declare -r blue='\033[0;34m'
|
|
|
|
declare -r nocolor='\033[0;0m'
|
|
|
|
|
|
|
|
while true; do
|
|
|
|
case "${1}" in
|
|
|
|
'-d'|'--directories-only')
|
|
|
|
fd_opts+=('--type' 'd')
|
|
|
|
shift
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
'-h'|'--help')
|
|
|
|
printHelp
|
|
|
|
exit
|
|
|
|
;;
|
|
|
|
'-i'|'--no-ignore')
|
|
|
|
fd_opts+=('--no-ignore')
|
|
|
|
shift
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
'-I'|'--no-ignore-vcs')
|
|
|
|
fd_opts+=('--no-ignore-vcs')
|
|
|
|
shift
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
--)
|
|
|
|
shift
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
-*)
|
|
|
|
printf '%s\n' "Unknown option: ${1}" >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
break
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
# Prevent fd from selecting everything
|
|
|
|
[[ -z "${*}" ]] && printf '%s\n' "No queries entered, cancelling" >&2 && exit 1
|
|
|
|
|
|
|
|
for pattern in "${@}"; do
|
|
|
|
while IFS= read -r -d '' file; do
|
|
|
|
files+=("${file}")
|
|
|
|
done < <(fd --hidden --print0 "${fd_opts[@]}" -- "${pattern}")
|
|
|
|
done
|
|
|
|
|
|
|
|
[[ -z "${files[*]}" ]] && printf '%s\n' "No results found" >&2 && exit 1
|
|
|
|
|
|
|
|
# List all filenames, pretty print them
|
|
|
|
for filename in "${files[@]}"; do
|
|
|
|
if [[ -f "${filename}" ]]; then
|
|
|
|
printf '%s\n' "${filename}"
|
|
|
|
elif [[ -d "${filename}" ]]; then
|
|
|
|
printf '%b%s%b\n' "${blue}" "${filename}" "${nocolor}"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
printf '%s' "Would you like to delete these files? "
|
|
|
|
read -r -n 1 ans
|
|
|
|
|
|
|
|
if [[ "${ans:-n}" =~ (Y|y) ]]; then
|
|
|
|
rm --recursive --force -- "${files[@]}"
|
|
|
|
else
|
|
|
|
printf '\n%s\n' "Operation cancelled" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|