Grava ls em array (dividido por nova linha)

2

Eu quero a saída da lista de diretórios em uma matriz.

readarray x < <( ls -la )
printf "%s" ${x[@]}

Então eu escrevi isso, o que funciona, mas é dividido por espaço e não por nova linha. Não consigo encontrar um parâmetro "newline" no manual readarray, por isso estou curioso para saber se existe uma maneira legal de resolver esse pedido. Por favor, não sugira usar find (estou restrito a usar ls -la ).

Eu uso o bash 4.3.

    
por Peter 11.08.2016 / 14:40

1 resposta

4

Ele lê por linha, mas você esqueceu de citar ${x[@]} , o que significa que o operador split + glob foi aplicado a ele.

readarray x < <(ls -la)
printf %s "${x[@]}"

Ou para remover o último caractere de nova linha de cada uma dessas linhas:

readarray -t x < <(ls -la)
printf 'line: %s\n' "${x[@]}"

Ou usando o operador split + glob :

IFS=$'\n' # split on newline
set -o noglob
x=($(ls -la))

(ao contrário de readarray -rt , esse método remove linhas vazias embora (improvável embora não impossível de ocorrer na saída de ls -la ))

Se você quiser ter a lista de nomes de arquivos (incluindo os ocultos) sem as outras informações de ls -l , prefira usar:

shopt -s nullglob dotglob
x=(*)

Ao contrário de ls -a , não inclui . nem .. . Se você realmente quisesse, você faria:

shopt -s nullglob
x=(.* *)
    
por 11.08.2016 / 16:13

Tags