You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
DevOps-Bash-tools/bin/organize_downloads.sh

136 lines
3.1 KiB
Bash

#!/usr/bin/env bash
# vim:ts=4:sts=4:sw=4:et
#
# Author: Hari Sekhon
# Date: 2024-07-18 16:21:32 +0200 (Thu, 18 Jul 2024)
#
# https///github.com/HariSekhon/DevOps-Bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
#
# https://www.linkedin.com/in/HariSekhon
#
set -euo pipefail
[ -n "${DEBUG:-}" ] && set -x
srcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck disable=SC1090,SC1091
. "$srcdir/lib/utils.sh"
# shellcheck disable=SC2034,SC2154
usage_description="
Moves files of well-known extensions in the \$HOME/Downloads directory older than 1 week
to capitalized subdirectories of their type to keep the \$HOME/Downloads/ directory tidy
Designed to be run either interactively or scheduled via local user 'crontab -e'
Can optionally specify a file extension, otherwise operates on a default list of common files,
aggregating several files of similar types eg. jpeg / png / webp into directories of names like PICS/
or .tar.* into TARBALLS/
To change the number of days for which files older than should be moved:
export DOWNLOADS_ORGANIZE_OLD_DAYS_THRESHOLD=7
"
# used by usage() in lib/utils.sh
# shellcheck disable=SC2034
usage_args="[<file_extension>]"
help_usage "$@"
max_args 1 "$@"
cd ~/Downloads
file_extension="${1:-}"
# Common file extensions cluttering my ~/Downloads directory
file_extensions=(
cer
cert
crt
csv
dmg
doc
docx
img
iso
jpeg
jpg
json
key
log
odp
p12
pdf
pem
png
ppt
pptx
rtf
svg
tar
tar.bz2
tar.gz
tbz2
tgz
txt
webp
xls
xlsx
xml
zip
)
# for the case match below
shopt -s nocasematch
move_files_of_extension(){
local file_extension="$1"
timestamp "Processing files or extension '$file_extension'"
echo >&2
local subdir
case "$file_extension" in
doc|docx|odp|rtf) subdir="DOC"
;;
ppt|pptx) subdir="POWERPOINT"
;;
xls|xlsx) subdir="EXCEL"
;;
img|iso) subdir="ISO"
;;
log) subdir="LOGS"
;;
crt|cert|key|p12|pem) subdir="SSL_CERTS"
;;
jpg|jpeg|png|webp|svg) subdir="PICS"
;;
tar|tar.gz|tar.bz2|tgz|tbz2) subdir="TARBALLS"
;;
*) subdir="$(tr '[:lower:]' '[:upper:]' <<< "$file_extension")"
esac
mkdir -p -v "$subdir"
#yes no |
find . -maxdepth 1 \
-type f \
-iname "*.$file_extension" \
-mtime +"${DOWNLOADS_ORGANIZE_OLD_DAYS_THRESHOLD:-7}" \
-exec mv -iv "{}" "$subdir/" \; # trailing slash is important to enforce directory move and not accidental rename behaviour
echo >&2
}
if [ -n "$file_extension" ]; then
move_files_of_extension "$file_extension"
else
for file_extension in "${file_extensions[@]}"; do
move_files_of_extension "$file_extension"
done
fi