Aqui está uma maneira alternativa de resolver o problema. Talvez assim funcione para você. Isso só chama uma vez, tornando muito mais rápido e eficiente.
stackoverflow.sh
#!/bin/sh
declare -a NAME_LIST=('cat list2')
#declare -i LIST_SIZE=${#NAME_LIST[*]}
declare EXPRESSION="find ${PWD} "
# build up the find command
for name in ${NAME_LIST[@]}; do
if test ${NAME_LIST[0]} = ${name}; then
EXPRESSION+="-type f -and -name $name "
else
EXPRESSION+="-or -type f -and -name $name "
fi
done
eval $EXPRESSION
Na minha versão aprimorada, $EXPRESSION
é igual a:
find /Users/charlie -type f -and -name one -or -type f -and -name two -or -type f -and -name three -or -type f -and -name four -or -type f -and -name five -or -type f -and -name six -or -type f -and -name seven -or -type f -and -name eight
Claro, o seu código original funciona bem para mim no bash no OSX (que tem o mesmo comando find que você faz no linux). Obviamente, como você também está repetindo o nome do arquivo (e não o caminho), a saída será uma lista dos arquivos e dos caminhos.
A única coisa que eu acho pode estar causando problemas é se o seu arquivo é codificado em unicode e os próprios nomes de arquivos reais não têm unicode. Caso contrário, imprime o caminho absoluto para o arquivo.
stackoverflow.sh:
#!/bin/sh
NAMES='cat list2'
for name in $NAMES; do
echo $name >&2
find $PWD -type f -name $name
done
Executando o programa:
$ charlie on macbook in ~
❯❯ cat list2
one
two
three
four
five
six
seven
eight
$ charlie on macbook in ~
❯❯ ./stackoverflow.sh
one
/Users/charlie/one
two
/Users/charlie/src/web/two
three
/Users/charlie/misc/three
four
/Users/charlie/four
five
/Users/charlie/Documents/five
six
/Users/charlie/Documents/Ideas/six
seven
/Users/charlie/seven
eight
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯ ./stackoverflow.sh
/Users/charlie/one
/Users/charlie/src/web/two
/Users/charlie/misc/three
/Users/charlie/four
/Users/charlie/Documents/five
/Users/charlie/Documents/Ideas/six
/Users/charlie/seven
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯ ./stackoverflow.sh 2>stderr-output
/Users/charlie/one
/Users/charlie/src/web/two
/Users/charlie/misc/three
/Users/charlie/four
/Users/charlie/Documents/five
/Users/charlie/Documents/Ideas/six
/Users/charlie/seven
/Users/charlie/Documents/eight
$ charlie on macbook in ~
❯❯ cmp list2 stderr-output
$ charlie on macbook in ~
❯❯ echo $?
0