Add script that sorts media files into a target folder
This commit is contained in:
@@ -0,0 +1,194 @@
|
||||
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
|
||||
|
||||
)
|
||||
|
||||
@@ -12,12 +12,12 @@ function imgfn2exif () (
|
||||
echo " : -d write exif information"
|
||||
echo " : -o overwrite existing exif information"
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user