Odpowiedzi:
Podobne do pierwszej opcji, ale pomija ogranicznik końcowy
ls -1 | paste -sd "," -
pastedostaje -(standardowe wejście) domyślnie, przynajmniej na mój paste (GNU coreutils) 8.22.
"\0", więc paste -sd "\0" -działało dla mnie!
EDYCJA : Po prostu „ ls -m ” Jeśli chcesz, aby separator był przecinkiem
Ach, siła i prostota!
ls -1 | tr '\n' ','
Zmień przecinek „ , ” na cokolwiek chcesz. Pamiętaj, że obejmuje to „przecinek końcowy”
\nw sobie, to również to zastąpi.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sedbyć trochę bardziej wydajny dzięki postaci ze znacznikiem końcowym:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sedpo trwydaje się po prostu usunąć ostatni symbol wydaje się nieuzasadnione. Idę zls -1 | tr '\n' ',' | head -c -1
To zastępuje ostatni przecinek nową linią:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m zawiera znaki nowej linii na znaku szerokości ekranu (na przykład 80.).
Głównie Bash (tylko lszewnętrzny):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Używanie readarray(aka mapfile) w Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Dzięki gniourf_gniourf za sugestie.
mapfile(Bash ≥ 4) jako: mapfile -t files < <(ls -1). Nie musisz się bawić IFS. I jest też krótszy.
IFSdo przyłączenia się do pola: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS. Lub użyj innej metody, jeśli chcesz separator zawierający więcej niż jeden znak.
Myślę, że ten jest niesamowity
ls -1 | awk 'ORS=","'
ORS jest „separatorem rekordów wyjściowych”, więc teraz linie zostaną połączone przecinkiem.
" OR ")
Połączenie ustawienia IFSi użycia "$*"może robić, co chcesz. Używam podpowłoki, więc nie przeszkadzam w $ IFS tej powłoki
(set -- *; IFS=,; echo "$*")
Aby uchwycić wynik,
output=$(set -- *; IFS=,; echo "$*")
setdziała? Dla mnie wygląda to trochę jak voodoo. płytki przegląd man setnie dostarczył mi również wielu informacji.
setkilka argumentów, ale nie masz opcji, ustawia parametry pozycyjne (1 $, 2 $, ...). --jest do ochrony setna wypadek, gdyby pierwszy argument (lub nazwa pliku w tym przypadku) zaczął się od myślnika. Zobacz opis --opcji w help set. Uważam, że parametry pozycyjne są wygodnym sposobem obsługi listy rzeczy. Mógłbym również zaimplementować to z tablicą:output=$( files=(*); IFS=,; echo "${files[*]}" )
type setpowie, set is a shell builtin. Więc man setnie pomoże, ale help setzrobi. Odpowiedź: „- Przypisz pozostałe argumenty do parametrów pozycyjnych.”
set -- *. Opóźniając ekspansję *jednego poziomu można uzyskać poprawny wynik bez konieczności powłoki sub: IFS=',' eval echo '"$*"'. Oczywiście to zmieni parametry pozycyjne.
Parsowanie lsw ogóle nie jest zalecane , więc alternatywnym lepszym sposobem jest użycie find, na przykład:
find . -type f -print0 | tr '\0' ','
Lub za pomocą findi paste:
find . -type f | paste -d, -s
Aby uzyskać ogólne łączenie wielu linii (niezwiązane z systemem plików), zaznacz: Zwięzłe i przenośne „łączenie” w wierszu poleceń systemu Unix .
Nie wymyślaj koła ponownie.
ls -m
Robi dokładnie to.
ls -mi, traby usunąć spację po przecinku, zrobiłbyśls -m | tr -d ' '
sed 's/, /,/g
po prostu bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
|pogryza końcowego , @camh.
bashi gnu coreutilsprintf
printf -vbędzie działać tylko w trybie bash, podczas gdy przedstawiona odpowiedź działa na wielu typach powłok.
|, pod warunkiem, że obie linie są używane: printf -v mystring "%s|" * ; echo ${mystring%|}.
To polecenie jest przeznaczone dla fanów PERL:
ls -1 | perl -l40pe0
Tutaj 40 to ósemkowy kod ascii dla przestrzeni.
-p przetworzy wiersz po wierszu i wydrukuje
-l zajmie się zastąpieniem końcowego znaku \ n przez zapewniany przez nas znak ascii.
-e ma poinformować PERL, że wykonujemy wykonanie wiersza poleceń.
0 oznacza, że tak naprawdę nie ma polecenia do wykonania.
perl -e0 jest taki sam jak perl -e ''
Wygląda na to, że odpowiedzi już istnieją.
Jeśli chcesz
a, b, cformatować, użyj ls -m(odpowiedź Tulainsa Córdova )
Lub jeśli chcesz a b cformatować, użyj ls | xargs(uproszczonej wersji odpowiedzi Chrisa J. )
Lub jeśli chcesz jakikolwiek inny ogranicznik |, użyj ls | paste -sd'|'(zastosowanie odpowiedzi Artem )
Dodając do odpowiedzi majkinetor, oto sposób usuwania ogranicznika końcowego (ponieważ nie mogę jeszcze skomentować pod jego odpowiedzią):
ls -1 | awk 'ORS=","' | head -c -1
Po prostu usuń tyle bajtów końcowych, ile liczy Twój separator.
Podoba mi się to podejście, ponieważ mogę używać ograniczników wieloznakowych + innych korzyści awk:
ls -1 | awk 'ORS=", "' | head -c -2
EDYTOWAĆ
Jak zauważył Peter, ujemna liczba bajtów nie jest obsługiwana w natywnej wersji głowy MacOS. Można to jednak łatwo naprawić.
Najpierw zainstaluj coreutils. „Narzędzia GNU Core to podstawowe narzędzia do obsługi plików, powłok i tekstów w systemie operacyjnym GNU.”
brew install coreutils
Polecenia również dostarczane przez MacOS są instalowane z prefiksem „g”. Na przykładgls .
Gdy to zrobisz, możesz użyć, gheadktóry ma ujemną liczbę bajtów lub lepiej, zrobić alias:
alias head="ghead"
Sed sposób
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
Uwaga :
Jest to złożoność liniowa, zastępująca tylko raz po dodaniu wszystkich linii do Przestrzeni Wzorów sed.
@ Odpowiedź AnandRajaseki i inne podobne odpowiedzi, takie jak tutaj , to O (n²), ponieważ sed musi zastępować za każdym razem, gdy do Przestrzeni Wzorów dodawana jest nowa linia.
Porównywać,
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
Jeśli twoja wersja xargs obsługuje flagę -d, to powinno działać
ls | xargs -d, -L 1 echo
-d jest flagą separatora
Jeśli nie masz -d, możesz wypróbować następujące
ls | xargs -I {} echo {}, | xargs echo
Pierwsze xargs pozwala określić ogranicznik, który w tym przykładzie jest przecinkiem.
-dokreśla separator wejściowy z GNU xargs, więc nie będzie działać. Drugi przykład pokazuje ten sam problem, co inne rozwiązania ogranicznika błądzenia na końcu.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Wyjaśnienie:
-e- oznacza polecenie do wykonania
:a- jest etykietą
/$/N- określa zakres dopasowania dla bieżącej i linii (N) ext
s/\n/\\n/;- zamienia wszystkie EOL na\n
ta; - goto label a, jeśli dopasowanie się powiedzie
Zaczerpnięte z mojego bloga .
Możesz użyć:
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls tworzy jedną kolumnę wyjściową po podłączeniu do rury, więc -1 jest nadmiarowa.
Oto kolejna odpowiedź Perla, wykorzystująca wbudowaną joinfunkcję, która nie pozostawia ogranicznika końcowego:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Niejasne -0777zmusza Perla do odczytania wszystkich danych wejściowych przed uruchomieniem programu.
sed alternatywa, która nie pozostawia ogranicznika końcowego
ls | sed '$!s/$/,/' | tr -d '\n'
lsma opcję -mograniczenia danych wyjściowych ", "przecinkiem i spacją.
ls -m | tr -d ' ' | tr ',' ';'
potokowanie tego wyniku w trcelu usunięcia spacji lub przecinka pozwoli na ponowne potokowanie wyniku w trcelu zastąpienia ogranicznika.
w moim przykładzie zastępuję separator ,separatorem;
zamień na ;dowolny ogranicznik jednego znaku , ponieważ tr uwzględnia tylko pierwszy znak w ciągach, które przekazujesz jako argumenty.
Wersja Quick Perl z końcowym ukośnikiem:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Wytłumaczyć:
ls -1 | paste -s -d ":" -Nie jestem pewien, czy jest to uniwersalne dla wszystkich wersji pasty