Localiza todos os arquivos, cria CSV com uma linha por subdiretório e nomes de arquivos em colunas

1

Eu tenho um diretório com subdiretórios e arquivos estruturados assim:

01/fileA
01/fileB
01/fileC
02/fileD
02/fileE
03/fileF
03/fileG
03/fileH
04/fileI

Gostaria de obter um CSV com esta aparência:

01, fileA, fileB, fileC
02, fileD, fileE
03, fileF, fileG, fileH
04, fileI

Em outras palavras, quero gerar um CSV com uma linha por subdiretório, com arquivos listados como colunas.

É possível fazer isso a partir da linha de comando do Linux?

    
por Nathan 17.11.2016 / 22:47

3 respostas

2

Isso pode ser feito de várias maneiras. Um método simples poderia ser este

for d in *
do  echo -n "$d, "
    ls -m $d
done
    
por 17.11.2016 / 23:19
1

Provavelmente é um exagero, mas usando o datamash GNU

find 0? -type f | sort -t/ | datamash -t\/ groupby 1 collapse 2 | sed 's/\//,/'
01,fileA,fileB,fileC
02,fileD,fileE
03,fileF,fileG,fileH
04,fileI

Ou com um hash de matrizes

do perl

find 0? -type f | perl -F/ -alne '
  push @{$dirs{$F[0]}}, $F[1]; 
  END{
    for $d (sort keys %dirs) {print join ",", $d, sort @{$dirs{$d}}}
  }'
01,fileA,fileB,fileC
02,fileD,fileE
03,fileF,fileG,fileH
04,fileI

ou com o GNU awk

find 0? -type f | sort -t/ | gawk -F/ '
  {dirs[$1] = dirs[$1] "," $2} 
  END {
    n = asorti(dirs,sdirs); 
    for(i=1;i<=n;i++) print sdirs[i] "" dirs[sdirs[i]]
}'
01,fileA,fileB,fileC
02,fileD,fileE
03,fileF,fileG,fileH
04,fileI

Com o GNU awk > 4.0 você pode simplificar o percurso da matriz para

  END {
    PROCINFO["sorted_in"] = "@ind_num_asc";
    for (d in dirs) print d "" dirs[d];
  }'
    
por 18.11.2016 / 00:00
0

Aqui está outra solução

find * -type d -printf "\n%p, " -exec ls -w0 -m {} \; |
    sed -e '/^$/d' -e 's/, *$//'

Saída

01, fileA, fileB, fileC
02, fileD, fileE
03, fileF, fileG, fileH
04, fileI
    
por 18.11.2016 / 00:19