Yanıtlar:
İlk seçeneğe benzer, ancak sondaki sınırlayıcıyı atlar
ls -1 | paste -sd "," -
paste
alı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
\n
varsa, bu da onun yerini alacaktır.
ls -1 | tr "\\n" "," | sed 's/\(.*\),/\1/'
sed
son işaret karakteri ile biraz daha verimli olabilirsiniz:ls -1 | tr "\\n" "," | sed 's/,$//'; echo ''
sed
sonra tr
sadece 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 ls
harici):
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.
mapfile
olarak (Bash ≥4): mapfile -t files < <(ls -1)
. Keman yapmaya gerek yok IFS
. Ve bu da daha kısa.
IFS
alanları 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 IFS
ve 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 set
bana çok fazla bilgi net değildi.
set
Bir 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 set
söyleyeceğim gibi set is a shell builtin
,. Yani, man set
yardımcı help set
olmayacak , 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.
ls
Genel 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 find
ve 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 -m
ve kullanaraktr
ls -m | tr -d ' '
sed 's/, /,/g
sadece bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
|
boğmaz, @camh.
bash
ve gnu coreutilsprintf
printf -v
verilen 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, c
Biçim istiyorsanız
, ls -m
( Tulains Córdova'nın cevabı ) kullanın
Veya a b c
format 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 ghead
negatif 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.
-d
GNU 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/'
ls
bir boruya bağlandığında bir sütun çıkışı üretir, bu nedenle -1
gereksizdir.
İş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 ',' ';'
tr
boşluk veya virgül kaldırmak için bu sonucun tr
borulanması, 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