Odpowiedzi:
Podobne do pierwszej opcji, ale pomija ogranicznik końcowy
ls -1 | paste -sd "," -
paste
dostaje -
(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”
\n
w sobie, to również to zastąpi.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
być trochę bardziej wydajny dzięki postaci ze znacznikiem końcowym:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
po tr
wydaje 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 ls
zewnę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.
IFS
do 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 IFS
i 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 "$*")
set
działa? Dla mnie wygląda to trochę jak voodoo. płytki przegląd man set
nie dostarczył mi również wielu informacji.
set
kilka argumentów, ale nie masz opcji, ustawia parametry pozycyjne (1 $, 2 $, ...). --
jest do ochrony set
na 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 set
powie, set is a shell builtin
. Więc man set
nie pomoże, ale help set
zrobi. 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 ls
w 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ą find
i 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 -m
i, tr
aby 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.
bash
i gnu coreutilsprintf
printf -v
bę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, c
formatować, użyj ls -m
(odpowiedź Tulainsa Córdova )
Lub jeśli chcesz a b c
formatować, 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ć, ghead
któ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.
-d
okreś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ą join
funkcję, która nie pozostawia ogranicznika końcowego:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Niejasne -0777
zmusza 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'
ls
ma opcję -m
ograniczenia danych wyjściowych ", "
przecinkiem i spacją.
ls -m | tr -d ' ' | tr ',' ';'
potokowanie tego wyniku w tr
celu usunięcia spacji lub przecinka pozwoli na ponowne potokowanie wyniku w tr
celu 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