parallel picsort
This commit is contained in:
parent
4b5e4e1d42
commit
326f2aa44d
1 changed files with 76 additions and 44 deletions
|
|
@ -1,70 +1,101 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
USER="$1"
|
if [[ $# -ne 4 ]]; then
|
||||||
|
echo "Usage: $0 <nc_user> <source_subdir> <dest_subdir> <unsortable_subdir>" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
REL_SOURCE_PATH="/$1/files/$2"
|
NC_USER="$1"
|
||||||
ABS_SOURCE_PATH="/var/lib/nextcloud/$1/files/$2"
|
SOURCE_SUBDIR="$2"
|
||||||
|
DEST_SUBDIR="$3"
|
||||||
|
UNSORTABLE_SUBDIR="$4"
|
||||||
|
|
||||||
REL_DEST_PATH="/$1/files/$3"
|
REL_SOURCE_PATH="/$NC_USER/files/$SOURCE_SUBDIR"
|
||||||
ABS_DEST_PATH="/var/lib/nextcloud/$1/files/$3"
|
ABS_SOURCE_PATH="/var/lib/nextcloud/$NC_USER/files/$SOURCE_SUBDIR"
|
||||||
|
|
||||||
REL_UNSORTABLE_PATH="/$1/files/$4"
|
REL_DEST_PATH="/$NC_USER/files/$DEST_SUBDIR"
|
||||||
ABS_UNSORTABLE_PATH="/var/lib/nextcloud/$1/files/$4"
|
ABS_DEST_PATH="/var/lib/nextcloud/$NC_USER/files/$DEST_SUBDIR"
|
||||||
|
|
||||||
|
REL_UNSORTABLE_PATH="/$NC_USER/files/$UNSORTABLE_SUBDIR"
|
||||||
|
ABS_UNSORTABLE_PATH="/var/lib/nextcloud/$NC_USER/files/$UNSORTABLE_SUBDIR"
|
||||||
|
|
||||||
echo "STARTING..."
|
echo "STARTING..."
|
||||||
|
|
||||||
chown -R www-data:www-data "$ABS_SOURCE_PATH"
|
chown -R www-data:www-data "$ABS_SOURCE_PATH"
|
||||||
chmod -R 770 "$ABS_SOURCE_PATH"
|
chmod -R 770 "$ABS_SOURCE_PATH"
|
||||||
|
|
||||||
SCAN="FALSE"
|
process_file() {
|
||||||
IFS=$'\n'
|
local f="$1"
|
||||||
for f in `find "$ABS_SOURCE_PATH" -iname *.PNG -o -iname *.JPG -o -iname *.JPEG -o -iname *.HEIC -o -iname *.CR2 -o -iname *.CR3 -o -iname *.MP4 -o -iname *.MOV`; do
|
local DATETIME DATE TIME YEAR MONTH DAY HOUR MINUTE SECOND HASH EXT RAW FILE RELPATH DIRNAME
|
||||||
SCAN="TRUE"
|
|
||||||
echo "PROCESSING: $f"
|
echo "PROCESSING: $f"
|
||||||
|
|
||||||
EXIF=`exiftool "$f"`
|
DATETIME="$(
|
||||||
if grep -q '^Create Date' <<< $EXIF
|
exiftool -s -s -s -CreateDate "$f" 2>/dev/null | head -n1
|
||||||
then
|
)"
|
||||||
DATETIME=`grep -m 1 "^Create Date" <<< $EXIF | cut -d: -f2- | xargs`
|
|
||||||
elif grep -q '^File Modification Date' <<< $EXIF
|
if [[ -z "$DATETIME" ]]; then
|
||||||
then
|
DATETIME="$(
|
||||||
DATETIME=`grep -m 1 '^File Modification Date' <<< $EXIF | cut -d: -f2- | xargs`
|
exiftool -s -s -s -FileModifyDate "$f" 2>/dev/null | head -n1 | cut -d'+' -f1 | cut -d'-' -f1
|
||||||
else
|
)"
|
||||||
RELPATH=$(realpath --relative-to="$ABS_SOURCE_PATH" "$f")
|
|
||||||
DIRNAME=$(dirname "$ABS_UNSORTABLE_PATH/$RELPATH")
|
|
||||||
echo "UNSORTABLE: $f"
|
|
||||||
mkdir -p "$DIRNAME"
|
|
||||||
mv "$f" "$DIRNAME"
|
|
||||||
continue
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
DATE=`cut -d' ' -f1 <<< $DATETIME`
|
if [[ -z "$DATETIME" ]]; then
|
||||||
TIME=`cut -d' ' -f2 <<< $DATETIME | cut -d'+' -f1`
|
RELPATH="$(realpath --relative-to="$ABS_SOURCE_PATH" "$f")"
|
||||||
|
DIRNAME="$(dirname "$ABS_UNSORTABLE_PATH/$RELPATH")"
|
||||||
|
echo "UNSORTABLE: $f"
|
||||||
|
mkdir -p "$DIRNAME"
|
||||||
|
mv -n -- "$f" "$DIRNAME/"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
YEAR=`cut -d':' -f1 <<< $DATE`
|
DATE="$(cut -d' ' -f1 <<< "$DATETIME")"
|
||||||
MONTH=`cut -d':' -f2 <<< $DATE`
|
TIME="$(cut -d' ' -f2 <<< "$DATETIME" | cut -d'+' -f1)"
|
||||||
DAY=`cut -d':' -f3 <<< $DATE`
|
|
||||||
HOUR=`cut -d':' -f1 <<< $TIME`
|
|
||||||
MINUTE=`cut -d':' -f2 <<< $TIME`
|
|
||||||
SECOND=`cut -d':' -f3 <<< $TIME`
|
|
||||||
|
|
||||||
HASH=`sha256sum "$f" | xxd -r -p | base64 | head -c 3 | tr '/+' '_-'`
|
YEAR="$(cut -d':' -f1 <<< "$DATE")"
|
||||||
EXT=`echo "${f##*.}" | tr '[:upper:]' '[:lower:]'`
|
MONTH="$(cut -d':' -f2 <<< "$DATE")"
|
||||||
if [[ "$EXT" = "cr2" ]] || [[ "$EXT" = "cr3" ]]
|
DAY="$(cut -d':' -f3 <<< "$DATE")"
|
||||||
then
|
HOUR="$(cut -d':' -f1 <<< "$TIME")"
|
||||||
|
MINUTE="$(cut -d':' -f2 <<< "$TIME")"
|
||||||
|
SECOND="$(cut -d':' -f3 <<< "$TIME")"
|
||||||
|
|
||||||
|
HASH="$(sha256sum "$f" | awk '{print $1}' | xxd -r -p | base64 | head -c 6 | tr '/+' '_-')"
|
||||||
|
EXT="$(tr '[:upper:]' '[:lower:]' <<< "${f##*.}")"
|
||||||
|
|
||||||
|
if [[ "$EXT" == "cr2" || "$EXT" == "cr3" ]]; then
|
||||||
RAW="raw/"
|
RAW="raw/"
|
||||||
else
|
else
|
||||||
RAW=""
|
RAW=""
|
||||||
fi
|
fi
|
||||||
FILE="$ABS_DEST_PATH/$YEAR-$MONTH/$RAW$YEAR$MONTH$DAY"-"$HOUR$MINUTE$SECOND"_"$HASH"."$EXT"
|
|
||||||
|
FILE="$ABS_DEST_PATH/$YEAR-$MONTH/${RAW}${YEAR}${MONTH}${DAY}-${HOUR}${MINUTE}${SECOND}_${HASH}.${EXT}"
|
||||||
echo "DESTINATION: $FILE"
|
echo "DESTINATION: $FILE"
|
||||||
mkdir -p "$(dirname "$FILE")"
|
mkdir -p "$(dirname "$FILE")"
|
||||||
mv -v "$f" "$FILE"
|
mv -- "$f" "$FILE"
|
||||||
done
|
}
|
||||||
|
|
||||||
|
mapfile -d '' -t FILES < <(
|
||||||
|
find "$ABS_SOURCE_PATH" -type f \( \
|
||||||
|
-iname '*.PNG' -o \
|
||||||
|
-iname '*.JPG' -o \
|
||||||
|
-iname '*.JPEG' -o \
|
||||||
|
-iname '*.HEIC' -o \
|
||||||
|
-iname '*.CR2' -o \
|
||||||
|
-iname '*.CR3' -o \
|
||||||
|
-iname '*.MP4' -o \
|
||||||
|
-iname '*.MOV' \
|
||||||
|
\) -print0
|
||||||
|
)
|
||||||
|
|
||||||
|
if ((${#FILES[@]})); then
|
||||||
|
export -f process_file
|
||||||
|
export ABS_SOURCE_PATH ABS_DEST_PATH ABS_UNSORTABLE_PATH
|
||||||
|
|
||||||
|
printf '%s\0' "${FILES[@]}" |
|
||||||
|
xargs -0 -n1 -P"$(nproc)" bash -c 'process_file "$1"' _
|
||||||
|
|
||||||
if [ "$SCAN" == "TRUE" ]; then
|
|
||||||
echo "SCANNING..."
|
echo "SCANNING..."
|
||||||
# find "$ABS_SOURCE_PATH/"* -type d -empty -delete >> /var/echo/nc-picsort.echo # nextcloud app bug when deleting folders
|
|
||||||
chown -R www-data:www-data "$ABS_DEST_PATH"
|
chown -R www-data:www-data "$ABS_DEST_PATH"
|
||||||
chown -R www-data:www-data "$ABS_UNSORTABLE_PATH"
|
chown -R www-data:www-data "$ABS_UNSORTABLE_PATH"
|
||||||
chmod -R 770 "$ABS_DEST_PATH"
|
chmod -R 770 "$ABS_DEST_PATH"
|
||||||
|
|
@ -72,7 +103,8 @@ if [ "$SCAN" == "TRUE" ]; then
|
||||||
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_SOURCE_PATH"
|
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_SOURCE_PATH"
|
||||||
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_UNSORTABLE_PATH"
|
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_UNSORTABLE_PATH"
|
||||||
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_DEST_PATH"
|
sudo -u www-data php /opt/nextcloud/occ files:scan --path "$REL_DEST_PATH"
|
||||||
#sudo -u www-data php /opt/nextcloud/occ preview:pre-generate
|
else
|
||||||
|
echo "NO MATCHING FILES FOUND."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "FINISH."
|
echo "FINISH."
|
||||||
Loading…
Reference in a new issue