大文字と小文字を区別しないパターンをlsと一致させる方法は?


57

大文字と小文字を区別せずに、特定のパターンに一致するすべてのファイルを一覧表示したいと思います。

たとえば、次のコマンドを実行します。

ls *abc*

ファイル名の一部に「abc」が含まれるすべてのファイルを表示したいのですが、大文字小文字を無視して、

-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

注意

マニュアルページでケースを検索しましたが、何も見つかりませんでした。

回答:


65

これは実際には、シェルではなく、シェルによって行われますls

ではbash、次を使用します。

shopt -s nocaseglob

そして、コマンド実行します。

またはzsh

unsetopt CASE_GLOB

またはyashで:

set +o case-glob

その後、コマンド。

それをそれぞれ.bashrc.zshrcまたはに入れたいかもしれません.yashrc

または、zshを使用します。

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

(つまり、ワイルドカードごとに大文字と小文字を区別しないグロビングです)

ksh93の場合:

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

グロビングは、シェルでlsはなくすべてのファイルであるため、異なる動作をする必要がありますls


bashで、使用する場合、元の設定にリセットする方法はshport -s nocaseglob
mtk

6
@mtk:オプションを設定するにはshopt -s、; を使用します。設定解除するには、を使用しますshopt -u。または、を使用( )して、設定が親シェルに影響を与えないように、すべてをサブシェルでラップすることができます(shopt -s nocaseglob ; ls *abc*)
-ruakh

POSIXやSUSなどでこれを移植できる方法はありませんか[aA][bB][cC]
ティモシー区14年

優れた解決策shoptです。過去15年間にbashを使用していても、コマンドに出会えなかったとは信じられません。
レザサナイエ

Jfg956の答えは正しいものです(次のもの)。正規表現があるのに、なぜシェルの動作を変更するのですか?
EnzoR

20

polemonで説明したように、*abc*ファイルのリストに拡張されるのは(lsではなく)シェルです。これは、パターンマッチングと呼ばれます。

パターンマッチングの動作全体を変更して大文字と小文字を無視する以外に、以外のパターンマッチングの形式を使用できます*。以下は、bashで必要なことを行います。

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

バッシュマンから:

[...]囲まれた文字のいずれかに一致します。

これにより、一致させるために使用できる*[aA][bB]c*abcまたは一致さABcせないabCまたはにするための、よりきめの細かい一致が可能になりますABC。または、e文字のすべてのインスタンスに一致させたいフランス語の例:

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

1
残念ながら、パターンが長くなると、そのアプローチはすぐに扱いにくくなります。しかし、短いことのために、それは動作します。
-derobert

@derobert:特に本当です(おそらくそうです)。シェルは、比較する前に、すべてのファイル名と一致要求を小文字にすることで、大文字と小文字を区別しないマッチングを最適化しました。ただし、これ[...]は多くの場合に役立つ可能性があり、言及する価値はありましたが。
jfg956

1
これは正しい答えです。シェルの動作を変更することはできません。
EnzoR

ロケールが適切に設定されていれば、等価クラスを使用できるはず[[=e=][=E=]]です。
ベンジャミンW.

8

-i(--ignore-case)オプションを追加しgrepて、以下の出力を取得することもできます。

[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

パターンマッチングは、grepがすべてを収集してからフィルタリングする必要があるため、grepよりもパフォーマンスが優れています。大きなフォルダーで作業する場合、顕著な違いがあります。
近江

@Omiさらに、正規表現はテキスト、特にテキスト用です。ファイル名には改行を含めることができます。
クサラナナンダ

3

これはlsでは不可能だと思いますが、代わりにfindを使用できます。

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

0

次のコードを使用します。

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

LC_COLLATE変数とは何ですか?さらに説明してもらえますか。
mtk

この@mtkについて知るためにリンクをクリックしてください
user1678213

0

-iinsensitiveオプションを追加するファイルを使用してGREPを実行できます。

たとえば、両方を見つけてabcABCこのコマンドを実行できます

    [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
ルイス・ペレス私はあなたが-i指揮する場所でオプションを使用したことはないと思います。
雑種


-2

tcshで、.aliasesにエイリアスを設定します

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

(「BS」= 1つの「バックスラッシュ」。これを使用してブラウザに表示する必要がありました。)

lsnc代わりに使用ls

bashでは、.bash_aliasesのようなエイリアスを試してください

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

以下のオプションを使用してlsls -l簡単な修正を行います。

tcsh:

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

バッシュ:

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

=lsnocaseの後に「」が欠落していませんか?
アントン

Anthon:(修正された)lsncとlsnclは、CygwinとUbuntuの両方でtcshとbashの下で動作します。bashには、「エイリアス」そのものではなく、関数を使用していることに注意してください。レスター
レスターイングバー

Anthon:はい、エイリアスlsncl = 'ls -l $ 1 |のように、bashでエイリアスを使用できます。sort -f -k 9 '
レスター・イングバー

この回答は、大文字と小文字を区別しないものとして扱われるようにlsに渡されるファイルを渡したい特定の質問には対応していません。シェルは合格合格した場合は少なすぎるにファイルをls、そこに何もないlssortすることができ、状況を修正することができます。他の回答で述べたように、問題はls構文ではなくシェルで解決する必要があります。
マークストースバーグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.