Найти все файлы, создать 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
  • Как создать синтаксис выделения Kate для CSV-файлов
  • Открыть файл CSV и перейти прямо к электронной таблице
  • Переключение отдельных строк в список, разделенный запятыми, с цитированными записями
  • Чтение столбцов из файла, затем столбец в exsisting CSV-файл
  • Как объединить файлы CSV
  • Scripting для разделения одной строки 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

    Как (если возможно) я могу закончить конкретный блокиратор, зависающий программой?

    Как установить локальный RPM, используя только файлы RPM с локальной зависимостью?

    Convince apt-get * not * использовать метод IPv6

    В какой файловой системе должен использоваться загрузочный раздел GRUB 2?

    Работа с плавающей точкой cron

    Можно ли сделать окно невидимым для щелчка в fluxbox?

    доступ к подстрокам из строк в текстовом файле и их хранение

    Linux перегревается на Macbook Pro 12,1 (начало 2015 года), но не на ноутбуке Asus

    Как полностью удалить KDE из Mint 17?

    Файлы заголовков Nixos X11 не найдены

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

    Использование тире (-) вместо имени файла

    Как установить безопасные разрешения для нескольких пользователей и нескольких веб-сайтов?

    Создание диаграмм (в PNG или JPG) с консоли?

    Медленная загрузка Fedora 16: почему и как улучшить?

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