次のように構成されたサブディレクトリとファイルを含むディレクトリがあります。
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
つまり、サブディレクトリごとに1行とファイルを列として含む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
またはパールを使用してください配列のハッシュ値
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