Estou tentando procurar arquivos usando find
, e colocar esses arquivos em uma matriz Bash para que eu possa fazer outras operações sobre eles (por exemplo, ls
ou grep
eles). Mas não consigo entender por que readarray
não está lendo a find
saída, pois ela é canalizada para ela.
Digamos que eu tenha dois arquivos no diretório atual file1.txt
e file2.txt
. Portanto, a find
saída é a seguinte:
$ find . -name "file*"
./file1.txt
./file2.txt
Então, eu quero colocar isso em uma matriz cujos dois elementos são as strings "./file1.txt"
e "./file2.txt"
(sem aspas, obviamente).
Eu tentei isso, entre algumas outras coisas:
$ declare -a FILES
$ find . -name "file*" | readarray FILES
$ echo "${FILES[@]}"; echo "${#FILES[@]}"
0
Como você pode ver na echo
saída, minha matriz está vazia.
Então, o que exatamente estou fazendo de errado aqui? Por que a saída da readarray
leitura não é find
sua entrada padrão e coloca essas strings na matriz?
readarray -d '' < <(find your_args -print0)
A solução correta é:
Isso é semelhante ao que o BashFAQ 020 de Greg explica em detalhes e esta resposta abrange .
Não tem problema com arquivos nomeados ímpares (que não contêm NUL no nome), com espaços ou novas linhas. E o resultado é definido em uma matriz, o que o torna útil para processamento adicional.
fonte
readarray
também pode ler de stdinfonte
find -print0
a proteção contra nomes de arquivos "inesperados".