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

  • Вопрос о инструкциях конкатенации
  • Я хочу динамически печатать значение из файла csv
  • Объединить имя файла внутри CSV-файла для каждой строки для нескольких файлов CSV
  • CSV-файл + установить параметры и значения CSV в сценарии bash
  • awk: удалить строки, где поля 1 и 2 дублируют
  • uniq a csv файл, игнорирующий столбец, возможно, awk?
  • Поиск среднего значения, исключая первую строку
  • получить mysql число id в сценарии оболочки
  • 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

    как предотвратить обмен буфером

    Максимальный размер файла для инструмента create_compressed_fs

    Простое уведомление о завершении программы

    Ошибка загрузки Windows 7 после установки CentOS 7, как я могу ее вернуть?

    Как получить видеорежим, заданный hwinfo, когда он не работает? И как установить разрешение для входа?

    Как добавить пакеты на Fedora live USB

    Системный фильтр Exim с разделенной конфигурацией

    Изменение размера шрифта по умолчанию для отдельной учетной записи в KDE

    Privoxy: блокировка твиттера, facebook и google вне их доменовlr

    Не удалось установить выбранное ядро

    ! fmt только для текущей строки

    Как читать страницу руководства для встроенного bash?

    Используйте mgetty для ответа на вызов и нажмите клавишу

    Сценарий переключения Wi-Fi не работает должным образом через i3

    Частота кадров курсора мыши медленная, но только при входе в мою основную учетную запись

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