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
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?
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 perlfind 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];
}'
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
Tags command-line files csv