#!/bin/bash getFiles() { printf -v scantime '%(%s)T' for prune_expression in "${skippeddirectories[@]}" do prunes+=( -path "$sourcepath$prune_expression" -prune -o ) done (( cron )) || echo -n "Scanning $sourcepath... " # We probably have thousands of files, don't waste time on disk writes echo 'BEGIN TRANSACTION;' >&3 while read time size filename do if ! Select source_files id >/dev/null <<-EOWhere filename = $filename mime_type > 0 last_change = $time EOWhere then mimetype=$(file -b --mime-type "$sourcepath/$filename") if [[ $mimetype == application/ogg ]] || [[ $mimetype == audio/ogg ]] then case "$(head -n5 "$sourcepath/$filename" | tr -d '\0')" in *'vorbis'*) mimetype+=' vorbis' ;; *'OpusHead'*) mimetype+=' opus' ;; esac fi mimetypeid=$( InsertIfUnset mime_types <<-EOInsert mime_text $mimetype EOInsert ) InsertOrUpdate source_files \ last_change $time \ size $size \ last_seen $scantime \ mime_type $mimetypeid \ >/dev/null \ <<-EOWhere filename $filename EOWhere (( ++new )) if (( new % 1000 == 0 )) then echo 'COMMIT;BEGIN TRANSACTION;' >&3 (( debug )) \ && echo -ne "\bCommitted $count files... " fi else Update source_files last_seen $scantime <<-EOWhere filename = $filename EOWhere fi progressSpin done < <( find "$sourcepath" "${prunes[@]}" -type f -not -name '.*' -printf "%T@ %s %P\n" ) echo 'COMMIT;' >&3 (( cron )) || echo -n $'\r' echo "${count:-0} files found, ${new:=0} new or changed."$'\033[K' unset count }