Відповіді:
Подібний до першого варіанту, але він не відриває відмітника
ls -1 | paste -sd "," -
pasteотримує -(стандартний ввід) за замовчуванням, принаймні на моєму paste (GNU coreutils) 8.22.
"\0", так що paste -sd "\0" -працював для мене!
EDIT : Просто " 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 буде обробляти рядок за рядком та друкувати
- я подбаю про заміну останнього \ n символом ascii, який ми надаємо.
-е, щоб повідомити PERL, що ми виконуємо виконання командного рядка.
0 означає, що фактично немає команди для виконання.
perl -e0 те саме, що perl -e ''
Схоже, відповіді вже є.
Якщо ви хочете
a, b, cформату, використовуйте ls -m(відповідь Тулана Кордова )
Або якщо ви хочете a b cформату, використовуйте ls | xargs(спрощена версія відповіді Кріса Дж )
Або якщо ви хочете мати будь-який інший роздільник |, використовуйте ls | paste -sd'|'(застосування відповіді Артема )
Додавши відповідь majkinetor, ось спосіб зняття розмежувача в кінці (оскільки я не можу просто прокоментувати його відповідь):
ls -1 | awk 'ORS=","' | head -c -1
Просто видаліть стільки кінцевих байтів, скільки розраховується ваш роздільник.
Мені подобається такий підхід, оскільки я можу використовувати розділові знаки з кількома символами + інші переваги awk:
ls -1 | awk 'ORS=", "' | head -c -2
EDIT
Як зауважив Петро, у рідній версії MacOS не підтримується від'ємне число байтів. Однак це можна легко виправити.
Спочатку встановіть coreutils. "Основні утиліти GNU - це основні утиліти управління файлами, оболонками та текстами операційної системи GNU."
brew install coreutils
Команди, надані також MacOS, встановлюються з префіксом "g". Наприклад gls.
Після цього ви можете скористатись gheadнегативним числом байтів, а ще краще зробити псевдонім:
alias head="ghead"
Сед шлях,
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
Примітка :
Це лінійно за складністю, замінюючи лише один раз після того, як всі рядки додаються до простору Шаблону sed.
@ 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
Якщо ви версія xargs підтримує прапор -d, це має працювати
ls | xargs -d, -L 1 echo
-d - прапор роздільника
Якщо у вас немає -d, ви можете спробувати наступне
ls | xargs -I {} echo {}, | xargs echo
Перші xargs дозволяють вказати свій роздільник, який є комою в цьому прикладі.
-dвказує роздільник введення з xargs GNU, тому не буде працювати. Другий приклад демонструє те саме питання, що й інші рішення тут збитого роздільника в кінці.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Пояснення:
-e- позначає команду, яку потрібно виконати
:a- це мітка
/$/N- визначає сферу відповідності для поточного та (N) ext рядка
s/\n/\\n/;- замінює весь EOL на \n
ta;- goto label a, якщо збіг успішний
Взято з мого блогу .
Ви можете використовувати:
ls -1 | perl -pe 's/\n$/some_delimiter/'
lsвидає один вихід стовпця при підключенні до труби, тому -1надлишок.
Ось ще одна відповідь perl за допомогою вбудованої joinфункції, яка не залишає делімітера в кінці:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Незрозуміле -0777змушує перл прочитати всі входи перед запуском програми.
sed альтернатива, яка не залишає кінцевого роздільника
ls | sed '$!s/$/,/' | tr -d '\n'
lsмає можливість -mрозмежувати висновок ", "комою та пробілом.
ls -m | tr -d ' ' | tr ',' ';'
трубопровід цього результату, щоб trвидалити пробіл, або кома дозволить вам знову передати результат, trщоб замінити роздільник.
у моєму прикладі я замінюю роздільник ,на роздільник;
замініть ;будь- яким роздільником символів, який ви віддаєте перевагу, оскільки tr призначає лише перший символ у рядках, які ви передаєте як аргументи.
Швидка версія Perl з обробкою косою рисою:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Пояснити:
ls -1 | paste -s -d ":" -не впевнений, що це універсально для всіх версій пасти