web-dev-qa-db-ja.com

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

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

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

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

注意

Manページでケースを検索しましたが、何も見つかりませんでした。

61
mtk

これは実際には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*)

globbinglsではなく異なる動作をする必要があります。これらはすべてシェルによってlsに渡されるファイルだからです。

67
polemon

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

パターンマッチングの動作全体を大文字と小文字を区別しないように変更する以外に、*以外の形式のパターンマッチングを使用できます。以下はbashであなたが望むことをするでしょう:

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

バッシュマンから:

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

これにより、*[aA][bB]c*を使用してabcまたはABcを照合できますが、abCまたはABCは照合できません。または、フランス語の例で、e文字のすべてのインスタンスに一致させることができます。

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

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

[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
9
Mongrel

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

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

Insensitiveオプションを追加する-iを使用してファイルを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
0
Luis Perez

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

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