Найти все файлы, создать 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?

  • Может ли python извлекать таблицы org-mode из документов org?
  • Сохраняйте только строки, содержащие точное количество разделителей
  • Вычислять хиты в течение промежутка времени из файла журнала
  • Поиск среднего значения, исключая первую строку
  • Обработка файлов CSV
  • Как удалить все \ r \ n из файла, но сохраните \ n
  • Не удалось выполнить команду head или tail для файла
  • CSV - сохранить только определенные записи
  • 3 Solutions collect form web for “Найти все файлы, создать CSV с одной строкой для каждого подкаталога и имена файлов в столбцах”

    Это можно сделать несколькими способами. Одним простым способом может быть этот

     for d in * do echo -n "$d, " ls -m $d done 

    Вероятно, это избыток, но с использованием 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]; }' 

    Вот еще одно решение

     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 
    Interesting Posts

    Почему я не могу установить диск сейчас с ограниченной памятью?

    Отключить -skip-grant-tables в MySQL

    Результаты вывода результатов GCC в файл

    Как убить процесс, который говорит «Операция не разрешена» при попытке?

    Почему установка по умолчанию Linux запускает больше процессов, чем стандартная установка OpenBSD?

    Какой процесс выполняется до того, как я получу подсказку?

    Использование grep / sort / find для извлечения уникальных значений

    Calc добавляет '(апостроф) при импорте времени из CSV

    Как я могу заставить irssi-proxy отправлять мне пропущенные упоминания, когда я подключаюсь?

    Как я могу grep через файлы, чье имя начинается с `-`?

    Есть ли какая-нибудь книга, учебник по очень сложным сценариям оболочки

    В чем разница между sudo su – и sudo su –

    Как я могу узнать, какую версию лака я запускаю?

    Может ли оператор «case» Linux иметь концепцию «или»?

    Не удалось выполнить команду «lsscsi»

    Linux и Unix - лучшая ОС в мире.