Antworten:
Ähnlich wie bei der allerersten Option, lässt jedoch das nachfolgende Trennzeichen weg
ls -1 | paste -sd "," -
paste
erhält -
(Standardeingabe) als Standard, zumindest auf meinem paste (GNU coreutils) 8.22
.
"\0"
, also paste -sd "\0" -
für mich gearbeitet!
EDIT : Einfach " ls -m " Wenn Sie möchten, dass Ihr Trennzeichen ein Komma ist
Ah, die Kraft und Einfachheit!
ls -1 | tr '\n' ','
Ändern Sie das Komma " , " nach Belieben. Beachten Sie, dass dies ein "nachfolgendes Komma" enthält.
\n
, wird dies ebenfalls ersetzt.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
könnten ein wenig effizienter mit dem ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
after tr
scheint nur das letzte Symbol zu entfernen, was unvernünftig erscheint. Ich gehe mitls -1 | tr '\n' ',' | head -c -1
Dies ersetzt das letzte Komma durch eine neue Zeile:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
Enthält Zeilenumbrüche am Zeichen für die Bildschirmbreite (z. B. 80.).
Meistens Bash (nur ls
extern):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Verwenden von readarray
(aka mapfile
) in Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Vielen Dank an gniourf_gniourf für die Vorschläge.
mapfile
(Bash ≥4) als : mapfile -t files < <(ls -1)
. Keine Notwendigkeit, damit herumzuspielen IFS
. Und es ist auch kürzer.
IFS
die Felder verbinden : saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Oder verwenden Sie eine andere Methode, wenn Sie ein Trennzeichen mit mehr als einem Zeichen möchten.
Ich finde das großartig
ls -1 | awk 'ORS=","'
ORS ist das "Trennzeichen für Ausgabedatensätze", sodass Ihre Zeilen jetzt mit einem Komma verbunden werden.
" OR "
) verwendet werden
Die Kombination aus Einstellung IFS
und Verwendung von "$*"
kann tun, was Sie wollen. Ich verwende eine Subshell, damit ich das $ IFS dieser Shell nicht störe
(set -- *; IFS=,; echo "$*")
Um die Ausgabe zu erfassen,
output=$(set -- *; IFS=,; echo "$*")
set
? Sieht für mich ein bisschen nach Voodoo aus. Ein flacher Blick man set
brachte mir auch nicht viele Informationen ein.
set
eine Reihe von Argumenten, aber keine Optionen angeben, werden die Positionsparameter festgelegt ($ 1, $ 2, ...). --
ist zum Schutz da, set
falls das erste Argument (oder in diesem Fall der Dateiname) mit einem Bindestrich beginnt. Siehe die Beschreibung der --
Option in help set
. Ich finde die Positionsparameter eine bequeme Möglichkeit, eine Liste von Dingen zu handhaben. Ich hätte dies auch mit einem Array implementieren können:output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
Sie sagen werden , set is a shell builtin
. Also, man set
wird nicht helfen, wird aber help set
tun. Antwort: "- Weisen Sie den Positionsparametern alle verbleibenden Argumente zu."
set -- *
. Wenn Sie die Erweiterung um *
eine Ebene verzögern, erhalten Sie möglicherweise die richtige Ausgabe, ohne dass eine Sub-Shell erforderlich ist : IFS=',' eval echo '"$*"'
. Das ändert natürlich die Positionsparameter.
Das Parsen wird ls
im Allgemeinen nicht empfohlen , daher ist es alternativ besser zu verwenden find
, zum Beispiel:
find . -type f -print0 | tr '\0' ','
Oder mit find
und paste
:
find . -type f | paste -d, -s
Aktivieren Sie für das allgemeine Verknüpfen mehrerer Zeilen (nicht mit dem Dateisystem verbunden) Folgendes: Prägnantes und portables "Verknüpfen" in der Unix-Befehlszeile .
Das Rad nicht neu erfinden.
ls -m
Es macht genau das.
ls -m
und tr
entfernen Sie das Leerzeichen nach dem Komma, das Sie tun würdenls -m | tr -d ' '
sed 's/, /,/g
nur schlagen
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
, @camh.
bash
und printf
printf -v
nur in Bash, während die vorgestellte Antwort auf vielen Shell-Typen funktioniert.
|
, vorausgesetzt, beide Zeilen werden verwendet : printf -v mystring "%s|" * ; echo ${mystring%|}
.
Dieser Befehl ist für die PERL-Fans:
ls -1 | perl -l40pe0
Hier ist 40 der oktale ASCII-Code für den Raum.
-p verarbeitet zeilenweise und druckt
-l wird dafür sorgen, dass das nachfolgende \ n durch das von uns bereitgestellte ASCII-Zeichen ersetzt wird.
-e soll PERL informieren, dass wir die Befehlszeilenausführung durchführen.
0 bedeutet, dass tatsächlich kein Befehl ausgeführt werden muss.
perl -e0 ist dasselbe wie perl -e ''
Es sieht so aus, als ob die Antworten bereits existieren.
Wenn Sie a, b, c
formatieren möchten
, verwenden Sie ls -m
( Antwort von Tulains Córdova )
Oder wenn Sie a b c
Format möchten , verwenden Sie ls | xargs
(vereinfachte Version von Chris Js Antwort )
Oder wenn Sie ein anderes Trennzeichen wie möchten |
, verwenden Sie ls | paste -sd'|'
(Anwendung der Antwort von Artem )
Zusätzlich zur Antwort von Majkinetor können Sie nachfolgend das nachfolgende Trennzeichen entfernen (da ich seine Antwort noch nicht einfach kommentieren kann):
ls -1 | awk 'ORS=","' | head -c -1
Entfernen Sie einfach so viele nachfolgende Bytes, wie Ihr Trennzeichen zählt.
Ich mag diesen Ansatz, weil ich Trennzeichen mit mehreren Zeichen + andere Vorteile von awk
:
ls -1 | awk 'ORS=", "' | head -c -2
BEARBEITEN
Wie Peter bemerkt hat, wird die negative Byteanzahl in der nativen MacOS-Version von head nicht unterstützt. Dies kann jedoch leicht behoben werden.
Installieren Sie zuerst coreutils
. "Die GNU Core Utilities sind die grundlegenden Dienstprogramme zur Datei-, Shell- und Textmanipulation des GNU-Betriebssystems."
brew install coreutils
Befehle, die auch von MacOS bereitgestellt werden, werden mit dem Präfix "g" installiert. Zum Beispiel gls
.
Sobald Sie dies getan haben, können Sie verwenden, ghead
was eine negative Byteanzahl hat, oder besser Alias erstellen:
alias head="ghead"
Der sed Weg,
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
Hinweis :
Dies ist linear in seiner Komplexität und wird nur einmal ersetzt, nachdem alle Zeilen an den Musterraum von sed angehängt wurden.
@ AnandRajasekas Antwort und einige andere ähnliche Antworten, wie hier , sind O (n²), da sed jedes Mal ersetzen muss, wenn eine neue Zeile an den Musterraum angehängt wird.
Vergleichen,
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
Wenn Ihre Version von xargs das Flag -d unterstützt, sollte dies funktionieren
ls | xargs -d, -L 1 echo
-d ist das Trennzeichen
Wenn Sie -d nicht haben, können Sie Folgendes versuchen
ls | xargs -I {} echo {}, | xargs echo
Mit dem ersten xargs können Sie Ihr Trennzeichen angeben, das in diesem Beispiel ein Komma ist.
-d
Gibt das Eingabetrennzeichen mit GNU xargs an, funktioniert also nicht. Das zweite Beispiel zeigt das gleiche Problem wie andere Lösungen eines Streubegrenzers am Ende.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Erläuterung:
-e
- bezeichnet einen auszuführenden Befehl
:a
- ist eine Bezeichnung
/$/N
- definiert den Umfang der Übereinstimmung für die aktuelle und die (N) ext-Zeile
s/\n/\\n/;
- ersetzt alle EOL durch \n
ta;
- gehe zu Bezeichnung a, wenn die Übereinstimmung erfolgreich ist
Entnommen aus meinem Blog .
Sie können verwenden:
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls
Erzeugt eine Spaltenausgabe, wenn es an ein Rohr angeschlossen ist, sodass das -1
redundant ist.
Hier ist eine weitere Perl-Antwort mit der integrierten join
Funktion, die kein abschließendes Trennzeichen hinterlässt:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Das Obskure -0777
lässt Perl alle Eingaben lesen, bevor das Programm ausgeführt wird.
sed Alternative, die kein nachfolgendes Trennzeichen hinterlässt
ls | sed '$!s/$/,/' | tr -d '\n'
ls
hat die Möglichkeit -m
, die Ausgabe durch ", "
ein Komma und ein Leerzeichen zu begrenzen .
ls -m | tr -d ' ' | tr ',' ';'
Wenn Sie dieses Ergebnis weiterleiten tr
, um entweder das Leerzeichen oder das Komma zu entfernen, können Sie das Ergebnis erneut weiterleiten tr
, um das Trennzeichen zu ersetzen.
In meinem Beispiel ersetze ich das Trennzeichen ,
durch das Trennzeichen;
Ersetzen Sie ihn ;
durch ein beliebiges Zeichenbegrenzer, da tr nur das erste Zeichen in den Zeichenfolgen berücksichtigt, die Sie als Argumente übergeben.
Schnelle Perl-Version mit Trailing Slash Handling:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Erklären:
ls -1 | paste -s -d ":" -
Nicht sicher, ob das bei allen Versionen von Paste universell ist