Ответы:
Аналогичен самому первому варианту, но пропускает конечный разделитель
ls -1 | paste -sd "," -
paste
получает -
(стандартный ввод) по умолчанию, по крайней мере, на моем paste (GNU coreutils) 8.22
.
"\0"
, так что paste -sd "\0" -
работал для меня!
РЕДАКТИРОВАТЬ : просто " ls -m ", если вы хотите, чтобы ваш разделитель был запятой
Ах, сила и простота!
ls -1 | tr '\n' ','
Поменяйте запятую " , " на что хотите. Обратите внимание, что это включает "запятую"
\n
в нем, это также заменит это.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
могли бы быть немного более эффективными с символом конечного маркера:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
после, tr
кажется, просто для удаления последнего символа кажется неразумным. Я иду сls -1 | tr '\n' ',' | head -c -1
Это заменяет последнюю запятую новой строкой:
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 за предложения.
mapfile
(Bash) ≥4 как: mapfile -t files < <(ls -1)
. Не надо возиться IFS
. И это тоже короче.
IFS
чтобы присоединиться поля: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Или используйте другой метод, если вы хотите разделитель с более чем одним символом.
Я думаю, что это потрясающе
ls -1 | awk 'ORS=","'
ORS является «разделителем выходных записей», поэтому теперь ваши строки будут соединяться запятой.
" OR "
)
Комбинация настроек IFS
и использования "$*"
может делать то, что вы хотите. Я использую подоболочку, поэтому я не вмешиваюсь в $ IFS этой оболочки
(set -- *; IFS=,; echo "$*")
Чтобы захватить вывод,
output=$(set -- *; IFS=,; echo "$*")
set
работает? Для меня это выглядит как вуду. поверхностный просмотр man set
не принес мне много информации.
set
кучу аргументов, но без опций, он устанавливает позиционные параметры ($ 1, $ 2, ...). --
защищать set
в случае, если первый аргумент (или имя файла в этом случае) начинается с тире. Смотрите описание --
опции в help set
. Я считаю позиционные параметры удобным способом обработки списка вещей. Я мог бы также реализовать это с помощью массива:output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
скажет вам set is a shell builtin
. Так что, man set
не поможет, но help set
сделаю. Ответ: «- Присвойте все оставшиеся аргументы позиционным параметрам».
set -- *
. Отсрочка расширения *
одного уровня вы можете получить правильный вывод без необходимости подпроекта оболочки: IFS=',' eval echo '"$*"'
. Конечно, это изменит позиционные параметры.
ls
В целом, синтаксический анализ не рекомендуется , поэтому лучше использовать альтернативный способ find
, например:
find . -type f -print0 | tr '\0' ','
Или с помощью find
и paste
:
find . -type f | paste -d, -s
Для общего объединения нескольких строк (не относящихся к файловой системе), проверьте: сжатое и переносимое «соединение» в командной строке Unix .
Не изобретай велосипед.
ls -m
Это именно так.
ls -m
и, tr
чтобы удалить пробел после запятой, вы бы сделалиls -m | tr -d ' '
sed 's/, /,/g
просто удар
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
смущает отставание , @camh.
bash
гну и coreutilsprintf
printf -v
будет работать только в bash, в то время как представленный ответ работает на многих типах оболочек.
|
, при условии , что используются оба линий: printf -v mystring "%s|" * ; echo ${mystring%|}
.
Эта команда для поклонников PERL:
ls -1 | perl -l40pe0
Здесь 40 - восьмеричный восьмеричный код для пространства.
-p будет обрабатывать построчно и печатать
-l позаботится о замене завершающего \ n символом ascii, который мы предоставляем.
-e должен сообщить PERL, что мы выполняем командную строку.
0 означает, что на самом деле нет команды для выполнения.
perl -e0 совпадает с perl -e ''
Похоже, ответы уже существуют.
Если вы хотите
a, b, c
форматировать, используйте ls -m
( ответ Tulains Córdova )
Или, если вы хотите a b c
форматировать, используйте ls | xargs
(упрощенная версия ответа Криса J )
Или, если вы хотите любой другой разделитель, как |
, используйте ls | paste -sd'|'
(применение ответа Артема )
Седь,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
Примечание :
Это линейный по сложности, заменяющий только один раз после того, как все строки добавлены в Pattern Space.
@ AnandRajaseka в ответ , и некоторые другие подобные ответы, такие , как здесь , являются O (n²), потому что СЭД должна делать заменить каждый раз , когда новая строка добавляется в шаблон пространства.
Сравнивать,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
Добавляя поверх ответа majkinetor, вот способ удаления конечного разделителя (поскольку я пока не могу просто комментировать его ответ):
ls -1 | awk 'ORS=","' | head -c -1
Просто удалите столько конечных байтов, сколько рассчитывает ваш разделитель.
Мне нравится этот подход, потому что я могу использовать многосимвольные разделители + другие преимущества awk
:
ls -1 | awk 'ORS=", "' | head -c -2
РЕДАКТИРОВАТЬ
Как заметил Питер, отрицательный счетчик байтов не поддерживается в родной версии головы MacOS. Это, однако, может быть легко исправлено.
Сначала установите coreutils
. «Основные утилиты GNU - это базовые утилиты для работы с файлами, оболочками и текстом в операционной системе GNU».
brew install coreutils
Команды, также предоставляемые MacOS, устанавливаются с префиксом «g». Например gls
.
После того, как вы это сделаете, вы можете использовать ghead
с отрицательным числом байтов или, лучше, сделать псевдоним:
alias head="ghead"
Если ваша версия xargs поддерживает флаг -d, это должно работать
ls | xargs -d, -L 1 echo
-d - флаг-разделитель
Если у вас нет -d, вы можете попробовать следующее
ls | xargs -I {} echo {}, | xargs echo
Первый xargs позволяет вам указать разделитель, который в этом примере является запятой.
-d
задает входной разделитель с помощью GNU xargs, поэтому не будет работать. Второй пример демонстрирует ту же проблему, что и другие решения здесь, в отношении случайного разделителя в конце.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Объяснение:
-e
- обозначает команду, которая должна быть выполнена
:a
- является меткой
/$/N
- определяет область совпадения для текущей и (N) ext строки
s/\n/\\n/;
- заменяет все EOL на \n
ta;
- идет на метку a, если совпадение прошло успешно
Взято из моего блога .
Ты можешь использовать:
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls
при подключении к каналу выводит один столбец, поэтому он -1
является избыточным.
Вот еще один ответ Perl, использующий встроенную join
функцию, которая не оставляет завершающий разделитель:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Непонятный -0777
заставляет Perl читать все вводные данные перед запуском программы.
альтернатива sed, которая не оставляет завершающий разделитель
ls | sed '$!s/$/,/' | tr -d '\n'
ls
имеет возможность -m
разделить вывод ", "
запятой и пробелом.
ls -m | tr -d ' ' | tr ',' ';'
Если вы передадите этот результат, чтобы tr
удалить пробел или запятую, вы сможете снова передать результат, tr
чтобы заменить разделитель.
в моем примере я заменяю разделитель ,
разделителем;
замените его ;
любым предпочитаемым символом , так как tr учитывает только первый символ в строках, которые вы передаете в качестве аргументов.
Версия Quick Perl с обработкой косой черты:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Объяснить:
ls -1 | paste -s -d ":" -
не уверен, что это универсально со всеми версиями пасты