다음과 같이 구성된 하위 디렉터리와 파일이 있는 디렉터리가 있습니다.
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