查找所有文件,创建每个子目录一行和列中的文件名的 CSV

查找所有文件,创建每个子目录一行和列中的文件名的 CSV

我有一个包含子目录和文件的目录,其结构如下:

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

我想要一个如下所示的 CSV:

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

换句话说,我想生成一个 CSV,每个子目录一行,文件列为列。

是否可以从 Linux 命令行执行此操作?

答案1

这可以通过多种方式来完成。一种简单的方法可能是这样的

for d in *
do  echo -n "$d, "
    ls -m $d
done

答案2

这可能有点过分了,但是使用 GNU datamash

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

或者用 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

或使用 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

使用 GNU awk > 4.0,您可以将数组遍历简化为

  END {
    PROCINFO["sorted_in"] = "@ind_num_asc";
    for (d in dirs) print d "" dirs[d];
  }'

答案3

这是另一个解决方案

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

输出

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

相关内容