mirror of https://gitlab.com/dabruh/dotfiles.git
88 lines
2.2 KiB
Bash
Executable File
88 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# converta
|
|
#
|
|
# Run `convert` over a directory and filter files by a particular pattern
|
|
#
|
|
# Example - Convert all ARW files in ~/Pictures to PNG:
|
|
# ./converta -d ~/Pictures -p '.*.ARW' -e PNG
|
|
|
|
script_name="$(basename -- "$0")"
|
|
force=false
|
|
|
|
function usage() {
|
|
echo "Usage: $script_name [OPTIONS]"
|
|
echo
|
|
echo "Options:"
|
|
echo " -h Display help"
|
|
echo " -d [DIRECTORY] Directory of files to process"
|
|
echo " -o [EXTENSION] Target extension"
|
|
echo " -l [LEVELS] Limit the amount of directory levels to process"
|
|
echo " -p [PATTERN] Extended regular expression pattern for filtering files"
|
|
echo
|
|
echo "Example:"
|
|
echo " $script_name -d ~/Pictures -o JPG -l 2 -p '.*.ARW$'"
|
|
}
|
|
|
|
while getopts ":d:o:l:p:fh" arg; do
|
|
case $arg in
|
|
d) directory=$OPTARG ;;
|
|
o) extension=$OPTARG ;;
|
|
l) levels="-maxdepth $OPTARG" ;;
|
|
p) pattern=$OPTARG ;;
|
|
f) force=true ;;
|
|
h)
|
|
usage
|
|
exit 0
|
|
;;
|
|
:)
|
|
echo "$script_name: Must supply an argument to -$OPTARG." >&2
|
|
usage
|
|
exit 1
|
|
;;
|
|
?)
|
|
echo "Invalid option: -${OPTARG}."
|
|
echo
|
|
usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[ -z "$directory" ] && usage && exit 1
|
|
[ -z "$extension" ] && usage && exit 1
|
|
[ -z "$pattern" ] && usage && exit 1
|
|
|
|
# Kill ourself with SIGINT upon receiving SIGINT:
|
|
trap '
|
|
trap - INT # restore default INT handler
|
|
kill -s INT "$$"
|
|
' INT
|
|
|
|
echo "Will $($force && echo "forcibly ")convert files in '$directory' that match '$pattern' to '$extension'"
|
|
|
|
# shellcheck disable=SC2086
|
|
while read -r input_path; do
|
|
file="$(basename "$input_path")"
|
|
output_path="${input_path%.*}.$extension"
|
|
addl_str=""
|
|
cvt=true
|
|
grep -Eq "$pattern" <<<"$file" || continue
|
|
|
|
if [ -f "$output_path" ]; then
|
|
if [ "$(wc -c <"$output_path")" -eq 0 ]; then
|
|
addl_str=" (exists, 0 bytes)"
|
|
rm "$output_path"
|
|
elif ! $force; then
|
|
addl_str=" (already converted)"
|
|
cvt=false
|
|
else
|
|
addl_str=" (overwriting)"
|
|
rm "$output_path"
|
|
fi
|
|
fi
|
|
|
|
echo "$input_path -> $output_path$addl_str"
|
|
$cvt && convert "$input_path" "$output_path"
|
|
done <<<"$(find "$directory" $levels -type f)"
|