Como seus nomes de arquivo de exemplo não têm aspas duplas ou vírgulas, a solução é bem simples:
$ 'ls' > files.csv
Existem algumas sutilezas aqui:
-
Você deseja citar o comando
ls
caso tenha um alias que adicione indicadores a ele que afetem a saída, como-F
, que acrescenta sigilos de tipo de arquivo ou-C
, que força saída multi-coluna. Esses aliases são bastante comuns em sistemas Unix e Unix-like modernos. -
Quando
ls
está gravando em um pipeline em vez de em um terminal, ele imprime um nome de arquivo por linha em vez da saída de várias colunas mostrada na sua pergunta. POSIX requer uma saída de coluna única neste caso , e GNU e BSDls
obey.
Este arquivo CSV não terá uma linha de cabeçalho, mas o Excel pode lidar com isso; nem todos os leitores de CSV podem.
Mas e se houver caracteres especiais?
Aspas duplas e vírgulas são caracteres especiais em arquivos CSV, portanto, se você tentar o comando acima em um diretório contendo arquivos nomeados usando esses caracteres, não obterá um arquivo CSV válido.
Não é muito difícil lidar com esses casos.
Primeiro, vamos pegar o caso dos arquivos que só podem ter vírgulas. Esse vai ser um caso muito mais comum, já que as aspas duplas têm significado nas shells de comando Unix, então há um strong desincentivo para usá-las em nomes de arquivos:
$ 'ls' | sed -e 's/^/"/' -e 's/$/"/' > files.csv
Esses comandos de substituição de sequência sed
colocam aspas duplas no início e no final de cada linha, o que impede que um leitor de CSV trate vírgulas como separadores de campo.
Outra maneira de alcançar o mesmo fim é perl -ne 'chomp ; print "\"$_\"\n"'
Se você realmente tiver aspas nos nomes dos arquivos, a solução sed
se estende naturalmente:
$ 'ls' | sed -e 's/"/\"/g' -e 's/^/"/' -e 's/$/"/' > files.csv
Ou seja, escapamos de quaisquer caracteres de aspas duplas existentes antes de quebrar a linha em aspas semânticas.
Alguns leitores de CSV lidam com aspas duplas de maneira diferente, tratando dois caracteres de aspas duplas seguidas como uma aspa dupla literal:
$ 'ls' | sed -e 's/"/""/g' -e 's/^/"/' -e 's/$/"/' > files.csv