web-dev-qa-db-ja.com

カスタム区切り文字を使用して複数行のファイル名を1つに結合する方法

ls -1の結果を1行にまとめて、必要なもので区切ってみたいと思います。

これを実現するために使用できる標準のLinuxコマンドはありますか?

374
JavaRocky

一番最初のオプションと似ていますが、末尾の区切り文字を省略します。

ls -1 | paste -sd "," -
570
Artem

EDIT:単に "ls -m"を使いたい場合はコンマになる区切り文字

ああ、力とシンプルさ!

ls -1 | tr '\n' ','

カンマ ""を好きなように変更してください。これには「末尾のコンマ」が含まれることに注意してください。

346
zaf

これは最後のカンマを改行に置き換えます。

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に感謝します。

22

私はこれが素晴らしいと思います

ls -1 | awk 'ORS=","'

ORSは「出力レコード区切り文字」なので、行はコンマで結合されます。

19
majkinetor

IFSの設定と"$*"の使用の組み合わせはあなたが望むことをすることができます。私はこのシェルの$ IFSを妨害しないようにサブシェルを使っています

(set -- *; IFS=,; echo "$*")

出力をキャプチャするには

output=$(set -- *; IFS=,; echo "$*")
14
glenn jackman

lsの一般的な解析 はお勧めできません ので、代わりのより良い方法はfindを使用することです。次に例を示します。

find . -type f -print0 | tr '\0' ','

あるいはfindpasteを使うことで:

find . -type f | paste -d, -s

一般的に複数行を結合する場合(ファイルシステムには関係ありません)、Unixコマンドラインで 簡潔で移植可能な「結合」 を確認してください。

12
kenorb

車輪を再発明しないでください。

ls -m

まさにそれです。

9

このコマンドはPerlファンのためのものです。

ls -1 | Perl -l40pe0

ここで40はスペースの8進ASCIIコードです。

-p 1行ずつ処理して印刷します。

-lは、末尾の\ nを、指定したASCII文字に置き換えます。

-eは、Perlにコマンドライン実行を行っていることを知らせるためのものです。

0は、実行するコマンドが実際にはないことを意味します。

Perl -e0はPerl -e ''と同じです

7

ただぶつける

mystring=$(printf "%s|" *)
echo ${mystring%|}
7
ghostdog74

Trに対する改行の混乱を避けるために、lsに-bフラグを追加することができます。

ls -1b | tr '\n' ';'
6
yabt

答えはすでに存在しているようです。

a, b, cフォーマットが必要な場合は、ls -mTulainsCórdovaの答え )を使用してください。

または、a b cフォーマットが必要な場合は、ls | xargsChris Jの答えの簡易版 )を使用してください。

または、|のような他の区切り文字が必要な場合は、ls | paste -sd'|'を使用してください( Artemの回答 の適用)

4
plhn
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

説明:

-e - 実行されるコマンドを表します
:a - ラベルです
/$/N - 現在行と(N)行目のマッチの範囲を定義します
s/\n/\\n/; - すべてのEOLを\nに置き換えます
ta; - もしマッチが成功したらaにラベルを付けます

私のブログ から取得しました。

3
Anand Rajasekar

あなたのxargsのバージョンが-dフラグをサポートしているなら、これはうまくいくはずです。

ls  | xargs -d, -L 1 echo

-dは区切り文字フラグです

-dがない場合は、次のことを試すことができます。

ls | xargs -I {} echo {}, | xargs echo

最初のxargsでは、この例ではコンマである区切り文字を指定できます。

3
Chris J

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
3
zhazha

あなたが使用することができます:

ls -1 | Perl -pe 's/\n$/some_delimiter/'
2
codaddict

lsは、パイプに接続したときに1列の出力を生成するので、-1は冗長です。

末尾の区切り文字を残さない組み込みのjoin関数を使ったもう一つのPerlの答えは、次のとおりです。

ls | Perl -F'\n' -0777 -anE 'say join ",", @F'

あいまいな-0777は、プログラムを実行する前にPerlにすべての入力を読み込ませます。

末尾の区切り文字を残さないsedの代替

ls | sed '$!s/$/,/' | tr -d '\n'
2
Thor

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文字区切り文字に置き換えます。

0
Andy

Chompを使って複数の行を1行にまとめることができます。

Perl -e 'while(<>){if(/\$ /){chomp; print;} 'bad0>テスト

ifステートメントに改行条件を入れます。特殊文字または任意の区切り文字にすることができます。

0
Suman

末尾のスラッシュ処理付きのクイックPerlバージョン:

ls -1 | Perl -E 'say join ", ", map {chomp; $_} <>'

説明する:

  • Perl -E:機能をサポートしてPerlを実行します(例えば、...)
  • 例えば:航空券を使って印刷する
  • "、"、ARRAY_HEREを結合する: "、"で配列を結合する
  • map {chomp; $ _}行:各行からキャリアリターンを削除し、結果を返す
  • <>:stdin、各行はROWで、マップと結合して各ROWの配列を作成します
0
Celogeek San