すべてのファイルを探して、サブディレクトリごとに1行と列にファイル名のCSVを作成します。

すべてのファイルを探して、サブディレクトリごとに1行と列にファイル名の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

つまり、サブディレクトリごとに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

関連情報