ls -1
の結果を1行にまとめて、必要なもので区切ってみたいと思います。
これを実現するために使用できる標準のLinuxコマンドはありますか?
一番最初のオプションと似ていますが、末尾の区切り文字を省略します。
ls -1 | paste -sd "," -
EDIT:単に "ls -m"を使いたい場合はコンマになる区切り文字
ああ、力とシンプルさ!
ls -1 | tr '\n' ','
カンマ "、"を好きなように変更してください。これには「末尾のコンマ」が含まれることに注意してください。
これは最後のカンマを改行に置き換えます。
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に感謝します。
私はこれが素晴らしいと思います
ls -1 | awk 'ORS=","'
ORSは「出力レコード区切り文字」なので、行はコンマで結合されます。
IFS
の設定と"$*"
の使用の組み合わせはあなたが望むことをすることができます。私はこのシェルの$ IFSを妨害しないようにサブシェルを使っています
(set -- *; IFS=,; echo "$*")
出力をキャプチャするには
output=$(set -- *; IFS=,; echo "$*")
ls
の一般的な解析 はお勧めできません ので、代わりのより良い方法はfind
を使用することです。次に例を示します。
find . -type f -print0 | tr '\0' ','
あるいはfind
とpaste
を使うことで:
find . -type f | paste -d, -s
一般的に複数行を結合する場合(ファイルシステムには関係ありません)、Unixコマンドラインで 簡潔で移植可能な「結合」 を確認してください。
車輪を再発明しないでください。
ls -m
まさにそれです。
このコマンドはPerlファンのためのものです。
ls -1 | Perl -l40pe0
ここで40はスペースの8進ASCIIコードです。
-p 1行ずつ処理して印刷します。
-lは、末尾の\ nを、指定したASCII文字に置き換えます。
-eは、Perlにコマンドライン実行を行っていることを知らせるためのものです。
0は、実行するコマンドが実際にはないことを意味します。
Perl -e0はPerl -e ''と同じです
ただぶつける
mystring=$(printf "%s|" *)
echo ${mystring%|}
Trに対する改行の混乱を避けるために、lsに-bフラグを追加することができます。
ls -1b | tr '\n' ';'
答えはすでに存在しているようです。
a, b, c
フォーマットが必要な場合は、ls -m
( TulainsCórdovaの答え )を使用してください。
または、a b c
フォーマットが必要な場合は、ls | xargs
( Chris Jの答えの簡易版 )を使用してください。
または、|
のような他の区切り文字が必要な場合は、ls | paste -sd'|'
を使用してください( Artemの回答 の適用)
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
説明:
-e
- 実行されるコマンドを表します:a
- ラベルです/$/N
- 現在行と(N)行目のマッチの範囲を定義しますs/\n/\\n/;
- すべてのEOLを\n
に置き換えますta;
- もしマッチが成功したらaにラベルを付けます
私のブログ から取得しました。
あなたのxargsのバージョンが-dフラグをサポートしているなら、これはうまくいくはずです。
ls | xargs -d, -L 1 echo
-dは区切り文字フラグです
-dがない場合は、次のことを試すことができます。
ls | xargs -I {} echo {}, | xargs echo
最初のxargsでは、この例ではコンマである区切り文字を指定できます。
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の 答え 、および ここ のような他の同様の答えは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
あなたが使用することができます:
ls -1 | Perl -pe 's/\n$/some_delimiter/'
ls
は、パイプに接続したときに1列の出力を生成するので、-1
は冗長です。
末尾の区切り文字を残さない組み込みのjoin
関数を使ったもう一つのPerlの答えは、次のとおりです。
ls | Perl -F'\n' -0777 -anE 'say join ",", @F'
あいまいな-0777
は、プログラムを実行する前にPerlにすべての入力を読み込ませます。
末尾の区切り文字を残さないsedの代替
ls | sed '$!s/$/,/' | tr -d '\n'
Majkinetorの答えに加えて、これは末尾の区切り文字を削除する方法です(私はまだ彼の答えの下でコメントすることはできませんので):
ls -1 | awk 'ORS=","' | head -c -1
あなたの区切り文字が考慮しているのと同じくらい多くの末尾のバイトを削除してください。
私はこのアプローチが好きです。なぜなら、私は複数文字の区切り文字+ awk
の他の利点を使うことができるからです。
ls -1 | awk 'ORS=", "' | head -c -2
EDIT
Peterが気づいたように、負のバイト数はネイティブのMacOSバージョンのheadではサポートされていません。しかしこれは簡単に修正できます。
まずcoreutils
をインストールします。 "GNUコアユーティリティは、GNUオペレーティングシステムの基本ファイル、シェル、テキスト操作ユーティリティです。"
brew install coreutils
MacOSでも提供されているコマンドは接頭辞 "g"を付けてインストールされます。例えばgls
です。
これが済んだら、負のバイト数以上のghead
を使用することができます。
alias head="ghead"
ls
には、出力を-m
カンマとスペースで区切るためのオプション", "
があります。
ls -m | tr -d ' ' | tr ',' ';'
スペースまたはコンマを削除するためにこの結果をtr
にパイプすると、結果をtr
に再度パイプして区切り文字を置き換えることができます。
私の例では、私は区切り文字,
を区切り文字;
に置き換えます
trは引数として渡す文字列の最初の文字だけを考慮しているので、;
を任意の1文字区切り文字に置き換えます。
Chompを使って複数の行を1行にまとめることができます。
Perl -e 'while(<>){if(/\$ /){chomp; print;} 'bad0>テスト
ifステートメントに改行条件を入れます。特殊文字または任意の区切り文字にすることができます。
末尾のスラッシュ処理付きのクイックPerlバージョン:
ls -1 | Perl -E 'say join ", ", map {chomp; $_} <>'
説明する: