Відповіді:
Подібний до першого варіанту, але він не відриває відмітника
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 ":" -
не впевнений, що це універсально для всіх версій пасти