Com bash-4.4 e acima, você usaria:
readarray -d '' -t arr < <(
find . -type f -print0 | grep -zP 'some pattern')
Com versões anteriores de bash :
arr=()
while IFS= read -rd '' file; do
arr+=("$file")
done < <(find . -type f -print0 | grep -zP 'some pattern')
Ou (para ser compatível com versões antigas de bash que não tivessem a sintaxe arr+=() do estilo zsh):
arr=() i=0
while IFS= read -rd '' file; do
arr[i++]=$line
done < <(find . -type f | grep -zP 'some pattern')
Sua abordagem tem vários problemas:
- com
-o,grepapenas imprime as partes dos registros que correspondem ao padrão em oposição ao registro completo. Você não quer isso aqui. -
A saída delimitada por nova linha padrão de
findnão pode ser pós-processada, pois o caractere de nova linha é tão válido quanto qualquer outro em um caminho de arquivo. Você precisa de uma saída delimitada por NUL (portanto-print0infinde-zingreppara processar registros delimitados por NUL). - você também esqueceu de passar
IFS=pararead. - em
bashe sem a opçãolastpipe, a última parte de uma linha de tubulação é executada em um subshell, portanto, você só atualizaria o$arrdessa sub-sela.