回答:
最初のオプションと同様ですが、末尾の区切り文字を省略します
ls -1 | paste -sd "," -
paste
は-
、少なくともmyではデフォルトで(標準入力)を取得しますpaste (GNU coreutils) 8.22
。
"\0"
ためpaste -sd "\0" -
、私にとってはうまくいきました。
編集:区切り文字をカンマにしたい場合は、単に「ls -m」
ああ、パワーとシンプルさ!
ls -1 | tr '\n' ','
カンマ「、」を好きなように変更します。これには「末尾のコンマ」が含まれることに注意してください
\n
、これも置き換えられます。
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
エンドマーカー文字で、もう少し効率的かもしれない:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
after を使用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
Bash 4でreadarray
(別名mapfile
)を使用する:
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
。または、1文字以上のセパレータが必要な場合は、別の方法を使用します。
これは素晴らしいと思います
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 -- *
。*
1つのレベルの展開を遅らせると、サブシェルがなくても正しい出力が得られる場合がありますIFS=',' eval echo '"$*"'
。もちろん、これは位置パラメータを変更します。
ls
一般的な解析はお勧めできません。そのためfind
、たとえば、次のように使用することをお勧めします。
find . -type f -print0 | tr '\0' ','
またはfind
およびを使用してpaste
:
find . -type f | paste -d, -s
複数の行を結合する一般的な方法(ファイルシステムとは関係ありません)については、Unixコマンドラインで簡潔かつ移植可能な「結合」を確認してください。
ただバッシュ
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
。
bash
そしてgnu coreutilsprintf
printf -v
、bashでのみ機能しますが、提示された回答は多くのシェルタイプで機能します。
|
両方の行が使用されている場合は、末尾のが削除されますprintf -v mystring "%s|" * ; echo ${mystring%|}
。
このコマンドは、PERLファン用です。
ls -1 | perl -l40pe0
ここで、40はスペースの8進ASCIIコードです。
-pは行ごとに処理して出力します
-lは、末尾の\ nを、指定したASCII文字で置き換えます。
-eは、コマンドラインの実行を実行していることをPERLに通知します。
0は、実際に実行するコマンドがないことを意味します。
perl -e0はperl -e ''と同じです
答えはすでに存在しているようです。
a, b, c
フォーマットが必要な場合は、ls -m
(TulainsCórdovaの答え)を使用してください
あなたがしたい場合やa b c
フォーマット、使用するls | xargs
(バージョンsimpified クリス・Jの答えを)
それとも、のような他の区切りたい場合に|
使用し、ls | paste -sd'|'
(のアプリケーションアルテムの答え)
majkinetorの答えに加えて、これは末尾の区切り文字を削除する方法です(私はまだ彼の答えの下でコメントすることはできないので):
ls -1 | awk 'ORS=","' | head -c -1
デリミタが数えるだけの数の後続バイトを削除します。
複数の文字の区切り文字を使用できるため、このアプローチが好きですawk
。
ls -1 | awk 'ORS=", "' | head -c -2
編集
Peterが気づいたように、負のバイト数はネイティブMacOSバージョンのヘッドではサポートされていません。ただし、これは簡単に修正できます。
まず、をインストールしcoreutils
ます。「GNUコアユーティリティは、GNUオペレーティングシステムの基本的なファイル、シェル、およびテキスト操作ユーティリティです。」
brew install coreutils
MacOSでも提供されるコマンドは、プレフィックス「g」でインストールされます。例えばgls
。
これを実行したらghead
、負のバイト数を持つエイリアスを使用するか、エイリアスを作成します。
alias head="ghead"
sedの方法、
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の回答、およびhereなどの他のいくつかの同様の回答はO(n²)です。これは、sedがパターンスペースに新しい行が追加されるたびに置換する必要があるためです。
比べる、
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
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
説明:
-e
-実行するコマンドを示します
:a
-ラベルです
/$/N
-現在と(N)の行の一致の範囲を定義します
s/\n/\\n/;
-すべてのEOLを次と置き換えます\n
ta;
-一致が成功した場合はラベルaに移動します
私のブログから取られた。
末尾のスラッシュ処理を備えたクイックPerlバージョン:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
説明する:
ls -1 | paste -s -d ":" -
それがすべてのバージョンの貼り付けで共通であるかどうか不明