Перечислите каталоги и их файлы, сгруппировав их в одну строку для токенизации - PullRequest
0 голосов
/ 23 мая 2018

Я хочу сгруппировать имена каталогов с их файлами в скрипте bash.Например, если я наберу ls /home/maindir/*

, я получу home/maindir/dir1: file1 file2\n file3 home/maindir/dir2: file1 file2

Каталоги с файлами не разделены указанным разделителем, потому что есть случаи, когда file1 и file2 находятся в одном каталоге,между ними есть новая строка, поэтому я хочу, чтобы разделитель указывал имя каталога и его список файлов в одной строке.Пример вывода с разделителем новой строки:

home/maindir/dir1: file1 file2 file3\n
home/maindir/dir2: file1 file2\n
home/maindir/dir3: file1 file2 file4\n

1 Ответ

0 голосов
/ 23 мая 2018

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

файл с именем foo:

a
b
c

затемВы можете сказать:

echo $(<foo)

и получите

a b c

Но это может вызвать проблемы с именами файлов, особенно если они содержат специальные символы или пробелы.

СпасибоГордону Дэвиссону для простого обновления!

for d in /home/maindir/*    # includes full path each time
do [[ -d "$d" ]] || continue  # ignore nondirectories
   cd "$d"                    # go there to make filenames path-bare
   echo "$d:" * 
done

Обратите внимание, что это все еще включает подкаталоги.Вам нужно пропустить это?Если вы хотите быть более осторожным -

for d in /charter/apps/*
do [[ -d "$d" ]] || continue
   cd "$d"
   dir="$d: "
   hit=0
   for f in *
   do if [[ -f "$f" ]]
      then hit=1
           dir="$dir $f "
      fi
   done
   (( $hit )) && printf "$dir\n"
done

Этот также должен работать с файлами со встроенными пробелами & c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...