Files
dotconfigs/zsh/funcs/img2folder.sh
T

195 lines
5.1 KiB
Bash

function img2folder () (
#set -x
FLAG_DRYRUN=1
FLAG_MOVE=0
FLAG_SOURCE=
FLAG_TARGET=
function _print_help() {
echo "Sort media files from a source dir and into a target dir"
echo ""
echo "Usage: img2folder <options> -s <source-dir> -t <target-dir>"
echo " -s <source-dir> : source folder"
echo " -t <source-dir> : target folder"
echo " -d : no dry run"
echo " -m : move instead of copy"
}
function _img_fn_2_exif () {
file=$1
file_name=$(basename ${file})
file_name_prefix=${file_name%.*}
if [ $FLAG_DRYRUN -eq 1 ]; then
cmd=(echo)
else
cmd=()
fi
cmd+=(exiftool -overwrite_original -DateTimeOriginal=${file_name_prefix} ${file})
echo ${cmd}
"${cmd[@]}"
}
function _exif_to_isoformat () {
current_exif=$1
date_only=${current_exif#*Original*: }
date_wo_colon=${date_only//:/}
date_wo_ws=${date_wo_colon// /T}
echo ${date_wo_ws}
}
function _is_same_file () {
file1=$1
file2=$2
hash1=$(shasum $file1)
hash2=$(shasum $file2)
if [ "${hash1% *}" = "${hash2% *}" ]; then
echo 1
else
echo 2
fi
}
function _gen_target_file_path () {
date=$1
target_sort_dir=$2
extension=$3
suffix_c=$4
datedirs=${date:0:4}"/"${date:4:2}
filename=${date/T/-}
suffix_f=$(printf "%04d" "$suffix_c")
target_file_path=$target_path"/"$datedirs"/"$filename"-"$suffix_f"."$extension
echo $target_file_path
}
# process input flags
while true; do
case $1 in
-d)
FLAG_DRYRUN=0
shift;
;;
-h)
_print_help
exit 0
;;
-m)
FLAG_MOVE=1
shift;
;;
-s)
shift
FLAG_SOURCE=$1
shift
;;
-t)
shift
FLAG_TARGET=$1
shift
;;
*)
break
;;
esac
done
# make sure input is correct
if [ -z $FLAG_SOURCE ]; then
echo "You need to specify a source directory"
exit 1
fi
if [ -z $FLAG_TARGET ]; then
echo "You need to specify a target directory"
exit 1
fi
source_path=$(readlink -f ${FLAG_SOURCE})
target_path=$(readlink -f ${FLAG_TARGET})
if [ ! -d ${target_path} ]; then
echo "Target directory ${target_path} does not exist"
exit 1
fi
#set -x
# main processing
IFS=$'\n'
for file in $(find ${source_path} -type f); do
file_basename=$(basename $file)
extension=${file_basename##*.}
current_exif=$(exiftool -m -DateTimeOriginal ${file})
if [ -z ${current_exif} ]; then
_img_fn_2_exif ${file}
exit_value=$?
if [ $exit_value -ne 0 ]; then
echo "Could not add Exif information, exit value was $exit_value, skipping"
continue
else
current_exif=$(exiftool -m -DateTimeOriginal ${file})
fi
fi
datetime=$(_exif_to_isoformat ${current_exif})
# create target file path and make sure we dont generate duplicates
target_exists=true
suffix_c=0
while $target_exists; do
target_file_path=$(_gen_target_file_path ${datetime} ${target_path} ${extension} ${suffix_c})
if [ -e $target_file_path ]; then
if [ $(_is_same_file ${file} ${target_file_path}) -eq 1 ]; then
echo "Duplicate found, skipping ${file}."
break
else
suffix_c=$((suffix_c+1))
fi
else
target_exists=false
fi
done
# create directory if needed
target_dir_path=$(dirname ${target_file_path})
if [ ! -d ${target_dir_path} ]; then
if [ $FLAG_DRYRUN -eq 1 ]; then
cmd=(echo)
else
cmd=()
fi
cmd+=(mkdir -p ${target_dir_path})
echo ${cmd}
"${cmd[@]}"
fi
# copy or move file
if [ $FLAG_DRYRUN -eq 1 ]; then
cmd=(echo)
else
cmd=()
fi
if [ $FLAG_MOVE -eq 1 ]; then
cmd+=(mv)
else
cmd+=(cp)
fi
cmd+=($file $target_file_path)
echo ${cmd}
"${cmd[@]}"
done
# rm empty folders in source dir
if [ $FLAG_MOVE -eq 1 ]; then
for dir in $(find ${source_path} -type d); do
if [ $FLAG_DRYRUN -eq 1 ]; then
cmd=(echo)
else
cmd=()
fi
cmd+=(rmdir -p $dir)
echo ${cmd}
"${cmd[@]}"
done
fi
)