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
.