Obtém um arquivo CSV contendo nomes de arquivos dentro de um diretório?

1

Estou tentando descobrir como exportar os nomes dos arquivos que tenho em um diretório para serem salvos em um arquivo CSV que eu possa editar no Excel. O diretório é assim:

$ ls
Sample_38_41_1_A01  Sample_38_41_1_A11  Sample_38_41_1_B09
Sample_38_41_1_C07  Sample_38_41_1_D05  Sample_38_41_1_E03
Sample_38_41_1_F01

Eu quero que cada linha do arquivo CSV tenha o nome de um arquivo encontrado nesse diretório. Deve ficar assim no Excel:

A            B    C
1 Sample_38_41_1_A01
2 Sample_38_41_1_A11
3 Sample_38_41_1_B09 
4 Sample_38_41_1_C07 
5 Sample_38_41_1_D05
6 Sample_38_41_1_E03
7 Sample_38_41_1_F01
8 ...
    
por rdzvr 09.06.2015 / 18:12

2 respostas

6

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:

  1. 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.

  2. 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 BSD ls 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
    
por 09.06.2015 / 18:41
1

find * > yourfilename.csv muito mais fácil.

    
por 21.08.2015 / 01:08