모든 파일을 찾고, 하위 디렉터리당 한 행과 열에 파일 이름의 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

아니면 펄을 사용하세요배열의 해시 값

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

관련 정보