Jawaban:
Mirip dengan opsi pertama tetapi menghilangkan pembatas trailing
ls -1 | paste -sd "," -
paste
mendapat -
(input standar) sebagai default, setidaknya di my paste (GNU coreutils) 8.22
.
"\0"
, jadi paste -sd "\0" -
berfungsi untuk saya!
EDIT : Cukup " ls -m " Jika Anda ingin pembatas menjadi koma
Ah, kekuatan dan kesederhanaan!
ls -1 | tr '\n' ','
Ubah koma " , " menjadi apa pun yang Anda inginkan. Perhatikan bahwa ini termasuk "trailing koma"
\n
di dalamnya, ini akan menggantikannya juga.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
bisa menjadi sedikit lebih efisien dengan karakter penanda akhir:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
after tr
tampaknya hanya untuk menghapus simbol terakhir tampaknya tidak masuk akal. Saya pergi denganls -1 | tr '\n' ',' | head -c -1
Ini menggantikan koma terakhir dengan baris baru:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
termasuk baris baru pada karakter lebar layar (misalnya ke-80).
Sebagian besar Bash (hanya ls
eksternal):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Menggunakan readarray
(alias mapfile
) di Bash 4:
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Terima kasih kepada gniourf_gniourf untuk sarannya.
mapfile
(Bash ≥4) sebagai: mapfile -t files < <(ls -1)
. Tidak perlu mengutak-atik IFS
. Dan juga lebih pendek.
IFS
untuk bergabung dengan bidang: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS
. Atau gunakan metode lain jika Anda ingin pemisah dengan lebih dari satu karakter.
Saya pikir ini luar biasa
ls -1 | awk 'ORS=","'
ORS adalah "pemisah rekaman keluaran" jadi sekarang baris Anda akan digabungkan dengan koma.
" OR "
)
Kombinasi pengaturan IFS
dan penggunaan "$*"
dapat melakukan apa yang Anda inginkan. Saya menggunakan subkulit jadi saya tidak mengganggu $ IFS shell ini
(set -- *; IFS=,; echo "$*")
Untuk menangkap output,
output=$(set -- *; IFS=,; echo "$*")
set
kerjanya? Terlihat seperti voodoo bagiku. dangkal melihat melalui man set
tidak memberi saya banyak informasi baik.
set
banyak argumen tetapi tidak ada opsi, ia menetapkan parameter posisi ($ 1, $ 2, ...). --
ada untuk melindungi set
jika argumen pertama (atau nama file dalam kasus ini) terjadi mulai dengan tanda hubung. Lihat deskripsi --
opsi di help set
. Saya menemukan parameter posisi cara mudah untuk menangani daftar hal. Saya juga bisa menerapkan ini dengan sebuah array:output=$( files=(*); IFS=,; echo "${files[*]}" )
type set
akan memberitahu Anda set is a shell builtin
,. Jadi, man set
tidak akan membantu, tetapi help set
akan dilakukan. Jawab: "- Tetapkan argumen yang tersisa ke parameter posisi."
set -- *
. Menunda perluasan *
satu tingkat Anda mungkin mendapatkan output yang benar tanpa perlu sub shell: IFS=',' eval echo '"$*"'
. Tentu saja itu akan mengubah parameter posisi.
Parsing ls
secara umum tidak disarankan , jadi cara alternatif yang lebih baik adalah menggunakan find
, misalnya:
find . -type f -print0 | tr '\0' ','
Atau dengan menggunakan find
dan paste
:
find . -type f | paste -d, -s
Untuk penggabungan umum beberapa baris (tidak terkait dengan sistem file), periksa: Ringkas dan portabel "gabung" pada baris perintah Unix .
Jangan menemukan kembali roda.
ls -m
Itu persis seperti itu.
ls -m
dan tr
untuk menghapus spasi setelah koma yang akan Anda lakukanls -m | tr -d ' '
sed 's/, /,/g
hanya bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
mengejar jejak, @camh.
bash
dan gnu printf
printf -v
hanya akan bekerja di bash, sedangkan jawaban yang disajikan bekerja pada banyak jenis shell.
|
, asalkan kedua saluran yang digunakan: printf -v mystring "%s|" * ; echo ${mystring%|}
.
Perintah ini untuk penggemar PERL:
ls -1 | perl -l40pe0
Di sini 40 adalah kode ascii oktal untuk ruang.
-p akan memproses baris demi baris dan mencetak
-l akan mengurus penggantian trailing \ n dengan karakter ascii yang kami sediakan.
-e adalah untuk memberi tahu PERL bahwa kita sedang melakukan eksekusi baris perintah.
0 berarti sebenarnya tidak ada perintah untuk dieksekusi.
perl -e0 sama dengan perl -e ''
Sepertinya jawabannya sudah ada.
Jika Anda ingin
a, b, c
memformat, gunakan ls -m
( jawaban Tulains Córdova )
Atau jika Anda ingin a b c
memformat, gunakan ls | xargs
(versi sederhana jawaban Chris J )
Atau jika Anda ingin pembatas lain seperti |
, gunakan ls | paste -sd'|'
(aplikasi jawaban Artem )
Menambahkan di atas jawaban majkinetor, berikut adalah cara menghilangkan pembatas trailing (karena saya belum bisa mengomentari jawabannya):
ls -1 | awk 'ORS=","' | head -c -1
Hapus saja trailing byte yang dihitung oleh pembatas Anda.
Saya suka pendekatan ini karena saya bisa menggunakan pembatas multi-karakter + manfaat lain dari awk
:
ls -1 | awk 'ORS=", "' | head -c -2
EDIT
Seperti yang Peter perhatikan, jumlah byte negatif tidak didukung dalam versi kepala MacOS asli. Namun ini dapat dengan mudah diperbaiki.
Pertama, instal coreutils
. "Utilitas Inti GNU adalah utilitas manipulasi file, shell dan teks dasar sistem operasi GNU."
brew install coreutils
Perintah yang disediakan oleh MacOS juga diinstal dengan awalan "g". Sebagai contoh gls
.
Setelah Anda melakukan ini, Anda dapat menggunakan ghead
yang memiliki jumlah byte negatif, atau lebih baik, buat alias:
alias head="ghead"
Cara 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
Catatan :
Ini linear dalam kompleksitas, menggantikan hanya sekali setelah semua baris ditambahkan ke Pola Space.
@ AnandRajaseka menjawab , dan beberapa jawaban serupa lainnya, seperti di sini , adalah O (n²), karena sed harus melakukan penggantian setiap kali baris baru ditambahkan ke Pola Space.
Untuk membandingkan,
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
Jika versi xargs Anda mendukung flag -d maka ini akan berfungsi
ls | xargs -d, -L 1 echo
-d adalah bendera pembatas
Jika Anda tidak memiliki -d, maka Anda dapat mencoba yang berikut ini
ls | xargs -I {} echo {}, | xargs echo
Xargs pertama memungkinkan Anda untuk menentukan pembatas yang merupakan koma dalam contoh ini.
-d
menentukan pembatas input dengan GNU xargs, jadi tidak akan berfungsi. Contoh kedua menunjukkan masalah yang sama dengan solusi lain di sini dari pembatas tersasar pada akhirnya.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Penjelasan:
-e
- menunjukkan perintah yang akan dieksekusi
:a
- adalah label
/$/N
- mendefinisikan ruang lingkup kecocokan untuk arus dan (ext) garis
s/\n/\\n/;
- menggantikan semua EOL dengan \n
ta;
- label goto a jika pertandingan berhasil
Diambil dari blog saya .
Kamu bisa menggunakan:
ls -1 | perl -pe 's/\n$/some_delimiter/'
ls
menghasilkan satu output kolom ketika terhubung ke pipa, sehingga -1
redundan.
Inilah jawaban perl lainnya menggunakan join
fungsi builtin yang tidak meninggalkan pembatas trailing:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Yang tidak jelas -0777
membuat perl membaca semua input sebelum menjalankan program.
sed alternatif yang tidak meninggalkan pembatas trailing
ls | sed '$!s/$/,/' | tr -d '\n'
ls
memiliki opsi -m
untuk membatasi output dengan ", "
koma dan spasi.
ls -m | tr -d ' ' | tr ',' ';'
perpipaan hasil ini tr
untuk menghilangkan spasi atau koma akan memungkinkan Anda untuk menyalurkan hasilnya lagi tr
untuk mengganti pembatas.
dalam contoh saya, saya mengganti pembatas ,
dengan pembatas;
ganti ;
dengan pembatas satu karakter apa pun yang Anda sukai karena tr hanya menghitung karakter pertama dalam string yang Anda berikan sebagai argumen.
Versi Perl cepat dengan penanganan garis miring:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Untuk menjelaskan:
ls -1 | paste -s -d ":" -
Tidak yakin apakah itu universal dengan semua versi tempel