Найти все файлы, создать CSV с одной строкой для каждого подкаталога и имена файлов в столбцах

У меня есть каталог с подкаталогами и файлами, структурированными следующим образом:

01/fileA 01/fileB 01/fileC 02/fileD 02/fileE 03/fileF 03/fileG 03/fileH 04/fileI 

Я хотел бы получить CSV, который выглядит так:

  • Найти, когда файл был закрыт в Unix
  • Объединить 2 файла на основе всех значений первого столбца первого файла
  • Копирование рекурсивно файлов с пробелами
  • Установите цвет активной вкладки tmux
  • Найти и заменить все перед строкой текста
  • Вычтите 1 из всех имен файлов (переименуйте их) в каталог.
  •  01, fileA, fileB, fileC 02, fileD, fileE 03, fileF, fileG, fileH 04, fileI 

    Другими словами, я хочу создать CSV с одной строкой для каждого подкаталога, причем файлы перечислены в виде столбцов.

    Возможно ли это сделать из командной строки Linux?

  • Как отключить звуковой сигнал в командной строке Linux CentOS 7?
  • Получение сбоев rsync в случайном порядке
  • Sticky bit vs setgid для облегчения доступа к общей записи
  • Как я могу быть уверен, что каталог или файл действительно удалены?
  • Поиск слова из определенного файла словаря в sdcv (консольная версия словаря Stardict)
  • Как удалить все подкаталоги из каталога?
  • 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 
    Linux и Unix - лучшая ОС в мире.