我有一个包含子目录和文件的目录,其结构如下:
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