Как объединить несколько строк с именами файлов в одну с пользовательским разделителем? - PullRequest
375 голосов
/ 04 мая 2010

Я хотел бы объединить результат ls -1 в одну строку и разделить его тем, что я хочу.

Существуют ли какие-либо стандартные команды Linux, которые я могу использовать для достижения этой цели?

Ответы [ 20 ]

573 голосов
/ 30 июня 2011

Аналогичен самому первому варианту, но без конечного разделителя

347 голосов
/ 04 мая 2010

РЕДАКТИРОВАТЬ : просто " ls -m " Если вы хотите, чтобы разделитель был запятой

Ах, сила и простота!

ls -1 | tr '\n' ','

Поменяйте запятую ", " на любую, какую хотите. Обратите внимание, что это включает "запятую"

22 голосов
/ 04 мая 2010

Заменяет последнюю запятую на новую строку:

ls -1 | tr '\n' ',' | sed 's/,$/\n/'

ls -m включает переводы строки с шириной экрана (например, 80-е).

Преимущественно Bash (только ls является внешним):

saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS

Использование readarray (он же mapfile) в Bash 4:

readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS

Спасибо gniourf_gniourf за предложения.

19 голосов
/ 14 декабря 2012

Я думаю, что это круто

ls -1 | awk 'ORS=","'

ORS - это разделитель выходных записей, поэтому теперь ваши строки будут соединяться запятой.

14 голосов
/ 06 мая 2011

Комбинация настроек IFS и использования "$*" может делать то, что вы хотите. Я использую подоболочку, чтобы не мешать этой оболочке $ IFS

(set -- *; IFS=,; echo "$*")

Для захвата вывода

output=$(set -- *; IFS=,; echo "$*")
12 голосов
/ 30 мая 2015

Синтаксический анализ ls в целом не рекомендуется , поэтому альтернативный лучший способ - использовать find, например:

find . -type f -print0 | tr '\0' ','

Или с помощью find и paste:

find . -type f | paste -d, -s

Для общего объединения нескольких строк (не относится к файловой системе) проверьте: Краткое и переносимое «соединение» в командной строке Unix .

9 голосов
/ 16 апреля 2013

Не изобретай велосипед.

ls -m

Это именно так.

7 голосов
/ 04 мая 2010

просто удар

mystring=$(printf "%s|" *)
echo ${mystring%|}
7 голосов
/ 03 апреля 2013

Эта команда для поклонников PERL:

ls -1 | perl -l40pe0

Здесь 40 - восьмеричный код ascii для пробела.

-p будет обрабатывать построчно и печатать

-l позаботится о замене завершающего \ n символом ascii, который мы предоставляем.

-e должен сообщить PERL, что мы выполняем командную строку.

0 означает, что на самом деле нет команды для выполнения.

perl -e0 совпадает с perl -e ''

6 голосов
/ 04 мая 2010

Чтобы избежать возможной путаницы с новой строкой для tr, мы можем добавить флаг -b к ls:

ls -1b | tr '\n' ';'
...