Useful sorting/clustering techniques using varying exif tags - unlabelled images

Started by richardl152, January 06, 2024, 07:32:57 AM

Previous topic - Next topic

richardl152

Like many,  I have a lot of nonGPS images which have not really been properly filenamed or  labelled but sometimes have pertinent exif data to allow subdirectory clustering and grouping.  I arrived at this working bash script and a) hope it is useful to others  b) would be really interested in any comprehensive image exif based clustering/grouping functions on as close a 'one size fits all' as sensible, prioritising on most frequently occurring exif relevant info and then subdividing.  The objective is to have clumps or clusters of related images likely to belong to the same 'set' if not the same date (creation/modified etc)

exiftool_sort_my_images_by_label ()
{
    for file in *.jpg;
    do
        echo "Processing file: $file";
        image_desc=$(exiftool -charset utf8 -s -s -ImageDescription "$file" | iconv -f utf-8 -t utf-8//IGNORE | cut -d':' -f2- | tr -d '\n' | tr -cd '[:alnum:] ');
        artist=$(exiftool -charset utf8 -s -s -Artist "$file" | iconv -f utf-8 -t utf-8//IGNORE | cut -d':' -f2- | tr -d '\n' | tr -cd '[:alnum:] ');
        user_comment=$(exiftool -charset utf8 -s -s -UserComment "$file" | iconv -f utf-8 -t utf-8//IGNORE | cut -d':' -f2- | tr -d '\n' | tr -cd '[:alnum:] ');
        xp_comment=$(exiftool -charset utf8 -s -s -XPComment "$file" | iconv -f utf-8 -t utf-8//IGNORE | cut -d':' -f2- | tr -d '\n' | tr -cd '[:alnum:] ');
        longest_label="";
        longest_length=0;
        for label in "$image_desc" "$artist" "$user_comment" "$xp_comment";
        do
            label_length=${#label};
            if [ "$label_length" -gt "$longest_length" ]; then
                longest_label="$label";
                longest_length="$label_length";
            fi;
        done;
        echo "Longest Label: $longest_label";
        cleaned_label=$(echo "$longest_label" | awk '{$1=$1};1' | cut -c1-50 | sed 's/\ /\_/g');
        echo "Cleaned Label: $cleaned_label";
        if [ -n "$cleaned_label" ]; then
            echo "Creating folder: $cleaned_label";
            mkdir -pv -p "$cleaned_label";
            gmv -b "$file" "$cleaned_label/";
        else
            echo "No valid label found. Moving to 'Unknown' folder.";
            mkdir -pv -p "Unknown";
            gmv -b "$file" "Unknown/";
        fi;
    done
}