Para que isso funcione, você precisa de files
para ser uma matriz, não uma variável. Experimente:
files=("${@:2}")
for f in "${files[@]}"; do
echo "$f"
done
Exemplo:
$ bash script.sh first "test image.jpg" "another test.txt"
test image.jpg
another test.txt
Discussão
Do código original, considere esta afirmação:
files="${@:2}"
Isso atribui todos os argumentos após o primeiro a files
como uma única cadeia indiferenciada. Podemos ver isso com este script:
$ cat test.sh
files="${@:2}"
declare -p files
$ bash test.sh first "test image.jpg" "another test.txt"
declare -- files="test image.jpg another test.txt"
Como você pode ver, toda a distinção entre o segundo e terceiro argumentos foi perdida.