echo * | xargs -n1 echo, Existe uma forma mais curta e elegante de listar uma linha por linha?

2

quando eu faço ls a saída está em colunas, no entanto eu preciso que a saída esteja em apenas uma coluna, linha por linha, uma entrada por linha.

Então, a única maneira que eu poderia chegar é:

echo * | xargs -n1 echo

Este é o caminho padrão para alcançá-lo ou é um estilo ruim?

    
por sharkant 17.05.2017 / 13:40

3 respostas

3

Isso é ruim, por todas as razões simples xargs é ruim, ou seja, quebra com nomes de arquivos contendo espaços em branco ou barras invertidas:

$ touch "foo bar"
$ echo * | xargs -n1 echo
foo
bar

Além disso, ele executa uma cópia do comando (% external)echo para cada arquivo.

Na maioria dos shells, você pode usar printf "%s\n" * para obter a listagem. Ou ls -1 .

No entanto, a questão é: o que você deseja fazer com a lista de arquivos? Basta olhar para eles ou usá-los em um script? Para o último, você provavelmente é melhor usar

for f in * ; do something with "$f" ; done

ou alguma variante de find ... -exec somecmd {} +

    
por 17.05.2017 / 13:49
5

O conselho geral sobre xargs é, não use xargs . Seu formato de entrada não é suportado por nenhuma ferramenta comum.

O próximo nível de uso de xargs é usar xargs -0 , com entrada que é separada por nulo. Mas no seu caso, o xargs é inútil de qualquer maneira.

Se você deseja listar arquivos em um diretório, use ls . Para garantir que haverá um único arquivo por linha, use ls -1 . O comando ls sempre coloca um arquivo por linha quando sua saída está indo para um pipe ou para um arquivo. Quando a saída é um terminal, o% normal ls alinha nomes de arquivos em colunas, mas ls -1 não.

Se você tiver uma lista de palavras e quiser imprimi-las uma por linha, use printf '%s\n' . Isso funciona de maneira semelhante a echo , exceto pelo fato de imprimir uma quebra de linha após cada elemento, em vez de um espaço, e não há perigo de contrabarras ou processamento de traço inicial.

printf '%s\n' *          # prints the names of the files in the current directory
printf '%s\n' "$@"       # prints the positional arguments
printf '%s\n' "${a[@]}"  # prints the element of the array 'a'
    
por 18.05.2017 / 03:09
2

Ele não fará o que você deseja quando tiver caracteres especiais em seus nomes de arquivo:

$ touch 'name
with newline' 'other name\nwith newline'
$ echo * | xargs -n1 echo
name
with
newline
other
name
with
newline

Se você quiser apenas listar os arquivos, há ls -1 . Caso contrário, use find com o sinalizador -exec .

    
por 17.05.2017 / 13:48