From 1fa431cc5f90a8d64132848f9d5ee80801515f77 Mon Sep 17 00:00:00 2001 From: Vincent Riquer Date: Thu, 2 May 2013 02:23:24 +0200 Subject: [PATCH] filenames and/or tags may contain | --- atom | 148 +++++++++++++++++++------------------- lib/copy/copyFiles_action | 16 ++--- lib/database/openDatabase | 1 + lib/files/sanitizeFile | 7 ++ lib/tasks/gettaskinfos | 24 +++---- lib/workers/master | 144 ++++++++++++++++++------------------- toys/checkextensions | 16 ++--- toys/missingtags | 44 ++++++------ 8 files changed, 204 insertions(+), 196 deletions(-) diff --git a/atom b/atom index 83a3906..dff6205 100755 --- a/atom +++ b/atom @@ -144,8 +144,8 @@ removed=0 read -u4 line until [[ $line == AtOM:NoMoreFiles ]] do - id=${line%|*} - filename=${line#*|} + id=${line%::AtOM:SQL:Sep::*} + filename=${line#*::AtOM:SQL:Sep::} if [ -n "$filename" ] then if rm -f "$filename" @@ -220,12 +220,12 @@ done echo 'BEGIN TRANSACTION;' >&3 for line in "${tagfiles[@]}" do - sourcefileid=${line%%|*} - rest=${line#*|} - lastchange=${rest%%|*} - rest=${rest#*|} - mimetype=${rest%%|*} - filename=${rest#*|} + sourcefileid=${line%%::AtOM:SQL:Sep::*} + rest=${line#*::AtOM:SQL:Sep::} + lastchange=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + mimetype=${rest%%::AtOM:SQL:Sep::*} + filename=${rest#*::AtOM:SQL:Sep::} echo -en "\rTags: $((++count*100/filecount))%" if (( count % 1000 == 0 )) then @@ -376,7 +376,7 @@ echo ' read -u4 line while ! [[ $line = AtOM:NoMoreFiles ]] do - decodefiles+=("$line|") + decodefiles+=("$line::AtOM:SQL:Sep::") read -u4 line done echo -n 'Creating tasks... ' @@ -384,41 +384,41 @@ echo -n 'Creating tasks... ' echo 'BEGIN TRANSACTION;' >&3 for line in "${decodefiles[@]}" do - fileid=${line%%|*} - rest=${line#*|} - filename=${rest%%|*} - rest=${rest#*|} - mimetype=${rest%%|*} - rest=${rest#*|} - destination=${rest%%|*} - rest=${rest#*|} - destfileid=${rest%%|*} - rest=${rest#*|} - rate=${rest%%|*} - rest=${rest#*|} - channels=${rest%%|*} - rest=${rest#*|} - bitrate=${rest%%|*} - rest=${rest#*|} - genre=${rest%%|*} - rest=${rest#*|} - albumartist=${rest%%|*} - rest=${rest#*|} - year=${rest%%|*} - rest=${rest#*|} - album=${rest%%|*} - rest=${rest#*|} - disc=${rest%%|*} - rest=${rest#*|} - artist=${rest%%|*} - rest=${rest#*|} - track=${rest%%|*} - rest=${rest#*|} - title=${rest%%|*} - rest=${rest#*|} - composer=${rest%%|*} - rest=${rest#*|} - performer=${rest%%|*} + fileid=${line%%::AtOM:SQL:Sep::*} + rest=${line#*::AtOM:SQL:Sep::} + filename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + mimetype=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destination=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + rate=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + channels=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + bitrate=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + genre=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + albumartist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + year=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + album=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + disc=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + artist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + track=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + title=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + composer=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + performer=${rest%%::AtOM:SQL:Sep::*} unset rest decodeFile getDestDir @@ -647,32 +647,32 @@ do echo -n "$destination: rename pattern changed, renaming files... " while [[ $line != AtOM:NoMoreFiles ]] do - oldfilename=${line%%|*} - rest=${line#*|}'|' - destfileid=${rest%%|*} - rest=${rest#*|} - filename=${rest%%|*} - rest=${rest#*|} - album=${rest%%|*} - rest=${rest#*|} - albumartist=${rest%%|*} - rest=${rest#*|} - artist=${rest%%|*} - rest=${rest#*|} - composer=${rest%%|*} - rest=${rest#*|} - disc=${rest%%|*} - rest=${rest#*|} - genre=${rest%%|*} - rest=${rest#*|} - performer=${rest%%|*} - rest=${rest#*|} - title=${rest%%|*} - rest=${rest#*|} - track=${rest%%|*} - rest=${rest#*|} - year=${rest%%|*} - rest=${rest#*|} + oldfilename=${line%%::AtOM:SQL:Sep::*} + rest=${line#*::AtOM:SQL:Sep::}'::AtOM:SQL:Sep::' + destfileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + filename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + album=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + albumartist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + artist=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + composer=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + disc=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + genre=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + performer=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + title=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + track=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + year=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} if [ -n "$oldfilename" -a -f "$oldfilename" ] then getDestDir @@ -720,10 +720,10 @@ done echo 'BEGIN TRANSACTION;' >&3 for line in "${lines[@]}" do - id=${line%%|*} - rest=${line#*|} - filename=${rest%%|*} - oldfilename=${rest#*|} + id=${line%%::AtOM:SQL:Sep::*} + rest=${line#*::AtOM:SQL:Sep::} + filename=${rest%%::AtOM:SQL:Sep::*} + oldfilename=${rest#*::AtOM:SQL:Sep::} if [[ $oldfilename != $filename ]] && [ -f "$oldfilename" ] then rm -f "$oldfilename" diff --git a/lib/copy/copyFiles_action b/lib/copy/copyFiles_action index 86820cc..c0c352f 100644 --- a/lib/copy/copyFiles_action +++ b/lib/copy/copyFiles_action @@ -31,15 +31,15 @@ copyFiles_action() { echo 'BEGIN TRANSACTION;' >&3 for copyfile in "${copyfiles[@]}" do - sourcefilename=${copyfile%%|*} + sourcefilename=${copyfile%%::AtOM:SQL:Sep::*} sourcedir=${sourcefilename%/*} - rest="${copyfile#*|}|" - lastchange=${rest%%|*} - rest=${rest#*|} - destinationid=${rest%%|*} - rest=${rest#*|} - destfileid=${rest%%|*} - rest=${rest#*|} + rest="${copyfile#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" + lastchange=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destinationid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} echo 'SELECT IFNULL( ( SELECT destination_files.filename FROM destination_files diff --git a/lib/database/openDatabase b/lib/database/openDatabase index df05d84..b75cef4 100644 --- a/lib/database/openDatabase +++ b/lib/database/openDatabase @@ -24,5 +24,6 @@ openDatabase() { exec 3> >(tee -a $tempdir/debug.log >&5) fi cat $schema >&3 + echo '.separator ::AtOM:SQL:Sep::' >&3 echo 'PRAGMA foreign_keys = ON;' >&3 } diff --git a/lib/files/sanitizeFile b/lib/files/sanitizeFile index 07e8e50..2968f5e 100644 --- a/lib/files/sanitizeFile +++ b/lib/files/sanitizeFile @@ -27,5 +27,12 @@ sanitizeFile() { string=${string/%+(.)/} fi fi + # Not exactly filename sanitity, but these will make the script fail in + # a decorative way.. + string="${string//&/\\&}" + strint="${string//;/\\;}" + # And these would exhibit strange behaviors + string="${string//\[/\\\[}" + string="${string//\]/\\\]}" echo "$string" } diff --git a/lib/tasks/gettaskinfos b/lib/tasks/gettaskinfos index f0023bd..5a51657 100644 --- a/lib/tasks/gettaskinfos +++ b/lib/tasks/gettaskinfos @@ -12,16 +12,16 @@ gettaskinfos() { WHERE id='$1'; ' >&3 read -u4 line - taskid=${line%%|*} - rest="${line#*|}|" - sourcefileid=${rest%%|*} - rest=${rest#*|} - required=${rest%%|*} - rest=${rest#*|} - cleanup=${rest%%|*} - rest=${rest#*|} - destfileid=${rest%%|*} - rest=${rest#*|} - destfilename=${rest%%|*} - rest=${rest#*|} + taskid=${line%%::AtOM:SQL:Sep::*} + rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" + sourcefileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + required=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + cleanup=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfilename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} } diff --git a/lib/workers/master b/lib/workers/master index 4c22abe..a6d0c99 100644 --- a/lib/workers/master +++ b/lib/workers/master @@ -69,78 +69,78 @@ master() { else (( ++active )) read -u4 line - taskid=${line%%|*} - rest="${line#*|}|" - sourcefileid=${rest%%|*} - rest=${rest#*|} - required=${rest%%|*} - rest=${rest#*|} - cmd_arg=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cmd_arg+=("${rest%%|*}") - rest=${rest#*|} - cleanup=${rest%%|*} - rest=${rest#*|} - destfileid=${rest%%|*} - rest=${rest#*|} - destfilename=${rest%%|*} - rest=${rest#*|} + taskid=${line%%::AtOM:SQL:Sep::*} + rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" + sourcefileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + required=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cmd_arg+=("${rest%%::AtOM:SQL:Sep::*}") + rest=${rest#*::AtOM:SQL:Sep::} + cleanup=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfileid=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + destfilename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} for key in ${!cmd_arg[@]} do [ -z "${cmd_arg[key]}" ] && unset cmd_arg[key] diff --git a/toys/checkextensions b/toys/checkextensions index a390bc1..3a427ff 100755 --- a/toys/checkextensions +++ b/toys/checkextensions @@ -112,8 +112,8 @@ getdstfiles() { done for line in "${lines[@]}" do - fileid=${line%|*} - filename=${line#*|} + fileid=${line%::AtOM:SQL:Sep::*} + filename=${line#*::AtOM:SQL:Sep::} echo $'\t'"$filename" (( rename )) && echo -n $'\t' (( rename )) && renameFile @@ -149,12 +149,12 @@ do done for line in "${lines[@]}" do - fileid=${line%%|*} - rest="${line#*|}|" - filename=${rest%%|*} - rest=${rest#*|} - mimetype=${rest%%|*} - rest=${rest#*|} + fileid=${line%%::AtOM:SQL:Sep::*} + rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" + filename=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} + mimetype=${rest%%::AtOM:SQL:Sep::*} + rest=${rest#*::AtOM:SQL:Sep::} dest=$sourcepath case "$mimetype" in 'audio/mpeg') diff --git a/toys/missingtags b/toys/missingtags index c64f5ee..ab73d1b 100755 --- a/toys/missingtags +++ b/toys/missingtags @@ -140,33 +140,33 @@ done for line in "${lines[@]}" do missing=() - filename=${line%%|*} - rest="${line#*|}|" - (( ${checks[genre]} )) && [ -z "${rest%%|*}" ] && missing+=( "Genre" ) - rest=${rest#*|} - (( ${checks[albumartist]} )) && [ -z "${rest%%|*}" ] && missing+=( "AlbumArtist" ) - rest=${rest#*|} - (( ${checks[year]} )) && [ -z "${rest%%|*}" ] && missing+=( "Year" ) - rest=${rest#*|} - (( ${checks[album]} )) && [ -z "${rest%%|*}" ] && missing+=( "Album" ) - rest=${rest#*|} - (( ${checks[disc]} )) && [ -z "${rest%%|*}" ] && missing+=( "Disc" ) - rest=${rest#*|} - (( ${checks[artist]} )) && [ -z "${rest%%|*}" ] && missing+=( "Artist" ) - rest=${rest#*|} - track=${rest%%|*} + filename=${line%%::AtOM:SQL:Sep::*} + rest="${line#*::AtOM:SQL:Sep::}::AtOM:SQL:Sep::" + (( ${checks[genre]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Genre" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[albumartist]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "AlbumArtist" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[year]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Year" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[album]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Album" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[disc]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Disc" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[artist]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Artist" ) + rest=${rest#*::AtOM:SQL:Sep::} + track=${rest%%::AtOM:SQL:Sep::*} (( ${checks[track]} )) && [ -z "$track" ] && missing+=( "Track" ) if (( ${checks[tracktotal]} )) && ! [[ $track =~ / ]] then missing+=( TrackTotal ) fi - rest=${rest#*|} - (( ${checks[title]} )) && [ -z "${rest%%|*}" ] && missing+=( "Title" ) - rest=${rest#*|} - (( ${checks[composer]} )) && [ -z "${rest%%|*}" ] && missing+=( "Composer" ) - rest=${rest#*|} - (( ${checks[performer]} )) && [ -z "${rest%%|*}" ] && missing+=( "Performer" ) - rest=${rest#*|} + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[title]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Title" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[composer]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Composer" ) + rest=${rest#*::AtOM:SQL:Sep::} + (( ${checks[performer]} )) && [ -z "${rest%%::AtOM:SQL:Sep::*}" ] && missing+=( "Performer" ) + rest=${rest#*::AtOM:SQL:Sep::} echo "$filename: ${missing[@]}" done