Büyük / küçük harf duyarsız kalıplarını ls ile eşleştirmek nasıl?


57

Davayı yok sayarak belirli bir kalıpla eşleşen tüm dosyaları listelemek istiyorum.

Örneğin, aşağıdaki komutları çalıştırıyorum:

ls *abc*

Dosya adının bir parçası olarak "abc" olan tüm dosyaları görmek istiyorum, davayı yok sayarak

-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt

Not

Dava sayfasını araştırdım ama hiçbir şey bulamadım.

Yanıtlar:


65

Bu aslında senin kabuğun tarafından yapılır, değil ls.

Olarak bash, kullanmak istiyorum:

shopt -s nocaseglob

ve sonra emrinizi çalıştırın.

Veya zsh:

unsetopt CASE_GLOB

Veya yaşça:

set +o case-glob

ve sonra emriniz.

Sen içine koymak isteyebilirsiniz .bashrc, .zshrcya da .yashrcsırasıyla.

Alternatif olarak, zsh ile:

setopt extendedglob
ls -d -- (#i)*abc*

(joker başına temelinde büyük / küçük harf duyarlı olmamaktır)

Ksh93 ile:

ls -d -- ~(i:*abc*)

Globbing'in farklı çalışmasını istersiniz ls, çünkü bunlar tüm lsbunlar kabuk tarafından geçirilen dosyalardır .


Bash, nasıl kullanılırsa orijinal ayarlarına sıfırlanır shport -s nocaseglob?
mtk

6
@mtk: Bir seçenek belirlemek için kullanırsınız shopt -s; onu üzmek için kullanırsın shopt -u. Alternatif olarak, kullanarak bir kabuktaki şeyi sarabilirsiniz ( )ayar ebeveyn kabuğu etkilemez böylece: (shopt -s nocaseglob ; ls *abc*).
eylülde

Yani POSIX veya SUS'ta bunun için taşınabilir bir yol yok [aA][bB][cC]mu?
Timothy Gu

Mükemmel çözüm, shoptbash kullanımının son 15 yılında emre rastlamadığımma inanamıyorum !
Reza Sanaie,

Jfg956'nın cevabı doğru olan (bir sonraki). Bunun için bir regexp varken neden kabuk davranışını değiştiriyorsunuz?
EnzoR

20

Polemon tarafından açıklandığı gibi, *abc*bir dosya listesine uzanan kabuktur (ls değildir) . Buna Desen Eşleştirme denir .

Tüm Desen Eşleştirme davranışını, durumu yoksaymak üzere değiştirmenin yanı sıra, 'dan başka bir desen eşleme biçimi kullanabilirsiniz *. Aşağıda bash ne istersen yapardın:

ls *[aA][bB][cC]*

Bash adamdan:

[...] Ekteki karakterlerden herhangi biriyle eşleşir.

Bu Kullanabileceğin daha ince taneli eşleştirme verir *[aA][bB]c*maç için abcya ABcama abCya ABC. Ya da ekarakterin tüm örneklerini eşleştirmek isteyebileceğim Fransızca bir örnek :

ls *[eéèêëEÉÈÊË]*

1
Maalesef, bu yaklaşım, model uzadıkça hızlı bir şekilde hantallaşıyor. Ama kısa şeyler için işe yarıyor.
derobert 21:12

@derobert: Tamamen doğru, özellikle (ve muhtemelen böyledir) kabuk, tüm dosya adlarını ve eşleşme isteğini karşılaştırmadan önce küçük harflere koyarak eşleştirme yoksayma durumunu optimize etti. Ancak, [...]birçok durumda faydalı olabilir ve bahsetmeye değer olmasına rağmen.
jfg956

1
Bu doğru cevap. Kabuk davranışını değiştirmek değil.
EnzoR

Yerel ayar düzgün ayarlanmışsa, denklik sınıflarını kullanabilmelisiniz [[=e=][=E=]].
Benjamin W.

8

Ayrıca almak için -i(--ignore-case) seçeneğini grepve aşağıdaki çıktıyı ekleyebilirsiniz .

[root@localhost ~]# ls -l | grep -i abc
-rw-r--r--  1 root root    0 Feb 25 20:41 fileabc.txt
-rw-r--r--  1 root root    0 Feb 25 20:41 fileABC.txt

Desen eşleştirme grep ile karşılaştırıldığında daha iyi bir performansa sahiptir, çünkü grep her şeyi toplamalı ve sonra filtre etmelidir. Daha büyük klasörlerle çalışırken göze çarpan bir fark var.
Omi

@Omi Ek olarak, normal ifadeler metin içindir , özellikle de metin satırları . Dosya adları yeni satırlar içerebilir.
Kusalananda

3

Bunun ls ile mümkün olduğunu sanmıyorum ama onun yerine find'i kullanabilirsiniz:

find . -maxdepth 1 -iname '*abc*'

0

aşağıdaki kodu kullanın:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE

LC_COLLATE değişkeni ne için? daha fazla açıklar mısın?
mtk

Bunun hakkında bilmek için linke tıklayın ( mtt
user1678213

0

-iDuyarsız seçeneği ekleyen dosyayı kullanarak GREP yapabilirsiniz .

Örneğin her ikisi bulmak abcve ABCbu komutu çalıştırabilirsiniz

    [root@mtk bin]# ls -l | grep -i abc
    640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
    676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt

5
Luis Perez -iKomutunuzda hiçbir yerde seçenek kullanmadığınızı düşünüyorum .
Mongrel


-2

Tcsh içinde .aliases ile bir diğer ad belirleyin

alias lsnc "ls BS!* | sort -f "

("BS" = bir "ters eğik çizgi"; bunu tarayıcımda görünmesi için kullanmak zorunda kaldım.)

ve lsncyerine kullanmakls

Bash gibi .bash_aliases içindeki bir diğer adı deneyin

lsnc() { ls $1 | sort -f ; }

Seçenekleriyle için ls, örneğin ls -l, burada basit bir düzeltme geçerli:

tcsh:

alias lsncl "ls -l BS!* | sort -f -k 9"

bash:

lsncl() { ls -l $1 | sort -f -k 9 ; }

=Lsnocase'den sonra bir ' ' eksik olmadığından emin misin ?
Anthon

Anthon: (değiştirilmiş) lsnc ve lsncl, hem Cygwin hem de Ubuntu'da tcsh ve bash altında benim için çalışıyor. Bash için, kendi başına bir "takma" değil bir işlev kullandığımı unutmayın. Lester
Lester Ingber

Anthon: Evet, muhtemelen takma adı bash olarak kullanabilirsiniz, alias lsncl = 'ls -l $ 1 | sıralama -f -k 9 '
Lester Ingber 0

Bu cevap, ls'e iletilen dosyaları büyük / küçük harf duyarlı olarak değerlendirmek isteyen belirli soruyu ele almamaktadır. Kabuk geçer geçerse çok az dosyaları ls, orada hiçbir şey lsve sortcan durumu düzeltmek için olabilir. Diğer cevaplarda belirtildiği gibi, problemin bir lssözdizimi ile değil kabukta çözülmesi gerekir .
Mark Stosberg
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.