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
,grep
apenas 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
find
nã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-print0
infind
e-z
ingrep
para processar registros delimitados por NUL). - você também esqueceu de passar
IFS=
pararead
. - em
bash
e sem a opçãolastpipe
, a última parte de uma linha de tubulação é executada em um subshell, portanto, você só atualizaria o$arr
dessa sub-sela.