Em vez de salvar a lista de arquivos em uma variável, faça um loop pelos nomes:
for name in TestDir/*; do
# the rest of the code
done
Para testar se $name ocorre no fileNames.txt , use grep -q :
for name in TestDir/*; do
if ! grep -qxF "$name" fileNames.txt; then
echo rm "$name"
fi
done
O -F faz com que grep execute uma comparação de string em vez de uma correspondência de expressão regular. Com -q não obtemos resultados de grep , apenas um status de saída que podemos usar com a instrução if (true se a string foi encontrada, mas o ponto de exclamação inverte o sentido do teste). O -x informa grep que a string $name precisa corresponder a uma linha inteira, do início ao fim, não apenas uma parte de uma linha.
Eu protegi o rm real com echo . Execute e certifique-se de que os arquivos corretos sejam excluídos.
Se os nomes dos arquivos estiverem listados sem o caminho TestDir , altere $name no comando grep para ${name##*/} :
for name in TestDir/*; do
if ! grep -qxF "${name##*/}" fileNames.txt; then
echo rm "$name"
fi
done
Isso procurará a parte do nome do arquivo do caminho em $name em vez do caminho completo, incluindo TestDir .