Yanıtlar:
İlk seçeneğe benzer, ancak sondaki sınırlayıcıyı atlar
ls -1 | paste -sd "," -
pastealır -(standart girdi), en azından benim paste (GNU coreutils) 8.22.
"\0", bu yüzden paste -sd "\0" -benim için çalıştı!
EDIT : Basitçe " ls -m " Eğer sınırlayıcı virgül olmasını istiyorsanız
Ah, güç ve basitlik!
ls -1 | tr '\n' ','
" , " Virgülünü istediğiniz gibi değiştirin. Bunun bir "sondaki virgül" içerdiğini unutmayın
\nvarsa, bu da onun yerini alacaktır.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sedson işaret karakteri ile biraz daha verimli olabilirsiniz:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sedsonra trsadece son sembolü kaldırmak gibi görünüyor mantıksız görünüyor. ls -1 | tr '\n' ',' | head -c -1
Bu, son virgülün yerine yeni bir satır gelir:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m ekran genişliği karakterine yeni satırlar ekler (örneğin, 80. karakter).
Çoğunlukla Bash (sadece lsharici):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
Bash 4'te readarray(aka mapfile) kullanma :
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
Öneriler için gniourf_gniourf'a teşekkürler.
mapfileolarak (Bash ≥4): mapfile -t files < <(ls -1). Keman yapmaya gerek yok IFS. Ve bu da daha kısa.
IFSalanları katılmak için: saveIFS=$IFS; IFS=,; list=${files[*]}; IFS=$saveIFS. Ya da birden fazla karaktere sahip bir ayırıcı istiyorsanız başka bir yöntem kullanın.
Bence bu harika
ls -1 | awk 'ORS=","'
ORS "çıktı kayıt ayırıcısı" olduğundan, şimdi satırlarınız virgülle birleştirilecektir.
" OR ") Kullanılması nedeniyle harika
Ayar IFSve kullanım kombinasyonu "$*"istediğinizi yapabilir. Subshell kullanıyorum, bu yüzden bu kabuğun $ IFS'ine müdahale etmiyorum
(set -- *; IFS=,; echo "$*")
Çıktıyı yakalamak için,
output=$(set -- *; IFS=,; echo "$*")
setçalıştığı hakkında daha fazla bilginiz var mı? Bana biraz vudu gibi gözüküyor. sığ bakmak da man setbana çok fazla bilgi net değildi.
setBir grup argüman verirseniz , ancak seçenek yoksa, konum parametrelerini ayarlar ($ 1, $ 2, ...). ilk argümanın (veya bu durumda dosya adının) kısa çizgi ile başlaması durumunda --korumak için oradadır set. İçindeki --seçeneğin açıklamasına bakın help set. Konum parametrelerini bir şeylerin listesini işlemek için uygun bir yol olarak görüyorum. Ben de bir dizi ile bu uygulanmış olabilir:output=$( files=(*); IFS=,; echo "${files[*]}" )
type setsöyleyeceğim gibi set is a shell builtin,. Yani, man setyardımcı help setolmayacak , ama yapacak. Cevap: "- Konum parametrelerine kalan bağımsız değişkenleri atayın."
set -- *. Genişlemesini geciktirme *bir düzey Bir alt kabuk gerek kalmadan doğru çıktı alabilirsiniz: IFS=',' eval echo '"$*"'. Tabii ki bu pozisyon parametrelerini değiştirecek.
lsGenel olarak ayrıştırma tavsiye edilmez , bu nedenle alternatif daha iyi bir yöntem kullanmaktır find, örneğin:
find . -type f -print0 | tr '\0' ','
Veya tarafından kullanılarak findve paste:
find . -type f | paste -d, -s
Birden çok satırı genel olarak birleştirmek için (dosya sistemiyle ilgili olmayan) şunları kontrol edin: Unix komut satırında kısa ve taşınabilir “birleştirme” .
Tekerleği yeniden icat etme.
ls -m
Tam olarak bunu yapıyor.
ls -mve kullanaraktrls -m | tr -d ' '
sed 's/, /,/g
sadece bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
|boğmaz, @camh.
bashve gnu coreutilsprintf
printf -vverilen cevap birçok kabuk türü üzerinde çalışırken, sadece bash'da çalışacaktır.
|her iki hat kullanmak kaydıyla,: printf -v mystring "%s|" * ; echo ${mystring%|}.
Bu komut PERL hayranları içindir:
ls -1 | perl -l40pe0
Burada 40 uzay için sekizli ascii kodu.
-p satır satır işlenecek ve yazdırılacaktır
-l, sondaki \ n değerini sağladığımız ascii karakteriyle değiştirmeye özen gösterir.
-e PERL'i komut satırı yürütme yaptığımızı bildirmektir.
0, aslında yürütülecek komutun olmadığı anlamına gelir.
perl -e0, perl -e ile aynı ''
Cevaplar zaten var gibi görünüyor.
a, b, cBiçim istiyorsanız
, ls -m( Tulains Córdova'nın cevabı ) kullanın
Veya a b cformat istiyorsanız ls | xargs( Chris J'nin cevabının basitleştirilmiş versiyonu )
Ya da başka bir sınırlayıcı istiyorsanız |, kullanın ls | paste -sd'|'( Artem cevabının uygulanması )
Majkinetor cevabının üstüne ekleyerek, burada sondaki sınırlayıcıyı kaldırmanın yolu var (çünkü henüz cevabının altında yorum yapamıyorum):
ls -1 | awk 'ORS=","' | head -c -1
Sınırlayıcınızın saydığı kadar çok bayt çıkarın.
Bu yaklaşımı seviyorum çünkü çok karakterli sınırlayıcıları ve diğer avantajlarını kullanabilirim awk:
ls -1 | awk 'ORS=", "' | head -c -2
DÜZENLE
Peter'ın fark ettiği gibi, kafanın yerel MacOS sürümünde negatif bayt sayısı desteklenmiyor. Ancak bu kolayca düzeltilebilir.
İlk olarak yükleyin coreutils. "GNU Core Utilities, GNU işletim sisteminin temel dosya, kabuk ve metin işleme yardımcı programlarıdır."
brew install coreutils
MacOS tarafından sağlanan komutlar "g" önekiyle birlikte yüklenir. Örneğin gls.
Bunu yaptıktan sonra gheadnegatif bayt sayısı olan veya daha iyisi takma ad kullanabilirsiniz:
alias head="ghead"
Sed yolu,
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
Not :
Bu karmaşıktır, tüm çizgiler sed'in Desen Alanına eklendikten sonra yalnızca bir kez değiştirilir.
@ AnandRajaseka'nın yanıtı ve burada olduğu gibi diğer benzer cevaplar O (n²) 'dir, çünkü sed, Pattern Space'e her yeni satır eklendiğinde yerine geçmek zorundadır.
Karşılaştırmak,
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
Eğer xargs sürümü -d bayrağını destekliyorsa, bu çalışmalıdır
ls | xargs -d, -L 1 echo
-d ayırıcı bayraktır
-D'niz yoksa aşağıdakileri deneyebilirsiniz
ls | xargs -I {} echo {}, | xargs echo
İlk xargs, bu örnekte virgül olan sınırlayıcınızı belirtmenize olanak tanır.
-dGNU xargs ile giriş sınırlayıcıyı belirtir, bu nedenle çalışmaz. İkinci örnek, burada bir başıboş sınırlayıcının diğer çözümleriyle aynı sorunu göstermektedir.
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
Açıklama:
-e- yürütülecek bir komutu belirtir
:a- bir etikettir
/$/N- geçerli ve (N) uzatma çizgisi için eşleşmenin kapsamını tanımlar - eşleşme başarılı olursa
s/\n/\\n/;tüm EOL'yi \n
ta;- goto etiketi a ile değiştirir
Blogumdan alındı .
Kullanabilirsiniz:
ls -1 | perl -pe 's/\n$/some_delimiter/'
lsbir boruya bağlandığında bir sütun çıkışı üretir, bu nedenle -1gereksizdir.
İşte join, sondaki ayırıcıyı bırakmayan yerleşik işlevi kullanan başka bir perl cevabı :
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
Belirsiz -0777, programı çalıştırmadan önce perl'in tüm girdileri okumasını sağlar.
izleyen bir sınırlayıcı bırakmayan sed alternatifi
ls | sed '$!s/$/,/' | tr -d '\n'
ls-mçıktıyı ", "virgül ve boşlukla sınırlama seçeneğine sahiptir .
ls -m | tr -d ' ' | tr ',' ';'
trboşluk veya virgül kaldırmak için bu sonucun trborulanması, sınırlayıcıyı değiştirmek için sonucu tekrar borulamanıza izin verecektir .
benim örneğimde ayırıcıyı ayırıcı ,ile değiştiriyorum;
yerine ;ne olursa olsun sınırlayıcı bir karakter tr sadece argüman olarak geçmek dizeleri ilk karakter için hesapları beri tercih ederim.
Sonunda eğik çizgi işleme özelliğine sahip Hızlı Perl versiyonu:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
Açıklamak için:
ls -1 | paste -s -d ":" -, tüm macun sürümleriyle evrensel olup olmadığından emin değilim