Garip davranış “ls -a | grep ^ \. ”


10

Bir pwd içeriğini listelemek ve sadece nokta ile başlayan dosyayı görüntülemek istedim. Denedim ls -a | grep ^\.ama neden çıktı nokta ile başlamıyor dosyaları içerdiğini anlayamıyorum. Örneğin:

Pictures
.pip
.pki
.profile
projects
Public

İstediğimi başarabileceğimi biliyorum, ls -ld .*sadece açıklayamadığım grep davranışını merak ediyorum.



Neden sadece ls -d .*ile başlayan tüm dosyaları listelemesiniz .?
Barmar

Dikkat notu: ls çıkışını asla başka bir komuta bağlamayın. Bunun yerine find komutunu kullanın. Güvenilir olmak için çok fazla ideosyncrasies var. Bkz: Pitfall 1 at mywiki.wooledge.org/BashPitfalls - 1 numara yaptı! Sitenin geri kalanı da harika.
Joe

Yanıtlar:


20

Argümanı grep,ls -a | grep '^\.'

Bunun nedeni, kabuğun \.onu düz hale getirmesi ve tekrar düz hale getirmesidir ., bu da grepdaha sonra tek karakterli bir joker karakter olarak davranır. Şüpheniz varsa, her zaman kabuğa özel bir karakter içeren (veya içerebilecek) bir dizeyi belirtin.


Kabuk neden yok sayar \?
ps-aux

\, kabuğun aşağıdaki karakteri gerçek harf olarak ele almasını sağlayan bir kaçış dizisidir. Burada grep ^\\., \\ kabuk tarafından tek bir ters eğik çizgi olarak ele alınır ve yine grep tek ters eğik çizgiyi ve ardından noktayı değişmez nokta olarak ele alır.
Avinash Raj

11

Grep normal ifadesini tırnak içine almanız gerekir.

ls -a | grep '^\.'

Not: Komutun çıktısını ayrıştırmayınls .


Ls çıkışını ayrıştırmak neden kötü?
ps-aux

Bağlantıdan: Varsayılan modda, standart çıktı bir terminal değilse, ls dosya adlarını yeni satırlarla ayırır. Adında satırsonu olan bir dosya olana kadar bu sorun olmaz.
Michael Durrant

@Michael Durrant: Dosya adlarında yeni satırlara izin vermenin önemli bir sistem hatası olduğunu öneririm.
jamesqf

@jamesqf - bkz Dosya adlarında yeni satır (özellikle sml cevabını).
don_crissti

0

Cmd ls -a yürütürseniz | grep ^ \. o zaman grep "\" karakterini özel bir karakter ve "." kaçmayın.

Cmd ls -a kullandığımızda | grep "^ \." sonra grep "\" karakterini özel bir karakter ve "." kaçar. Beklendiği gibi bir sonuç verecektir.

Eğer tırnaksız grep cmd kullanmak istiyorsanız "\" karakterinden de kaçmalısınız. Komutu izleyerek çift tırnak işareti olmadan sonuç bekleyebilirsiniz. ls -a | grep ^ \\.

Regex'teki özel karakterlerin anlamı hakkında ayrıntılar için aşağıdaki bağlantıya bakın. http://www.regular-expressions.info/quickstart.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.