指定されたファイルを除くすべてのファイルを見つける方法


13

lsような結果を与えることができます

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls

CentOS-Base.repo CentOS-Debuginfo.repo CentOS-Media.repo CentOS-Vault.repo

しかし、実際に私は見つけることを期待CentOS-Base.repoCentOS-Debuginfo.repoおよびCentOS-Vault.repoなくCentOS-Media.repo。だから私はこのコマンドを実行します

ls [^\(Media\)]

しかし、エラー情報が表示されます。どうすればよいですか?



@steeldriverあなたのリンクをありがとう、それは私にとって非常に
便利

あなたはにシェルを切り替え考えるかもしれませんzshの持っている、パターン除去機能を
バジーレStarynkevitch

回答:


10

最も単純な場合、次を使用できます(1番目のサブワードがstaticの場合CentOS)。

ls CentOS-[BDV]*

  • [BDV] -指定された文字のいずれかで始まる2番目のサブワードを保証する文字クラス

または否定と同じ:

ls CentOS-[^M]*

(CentOSで一般的に見られる)MGNU実装を使用して、文字を含むすべてのファイル名を無視する場合lsは、-I--ignore)オプションを使用します。

ls -I '*M*'

-I、--ignore = PATTERN
シェルPATTERNに一致する暗黙のエントリをリストしません

Media単語を含むエントリを無視するには:

ls -I '*Media*'

これらのパターンはに逐語的に渡す必要があるためls、引用符で囲む必要があります(そうでない場合、シェルはそれらを展開するグロブとして扱います)。


なぜ使用できないのls *[^M]*ですか?
-yode

ls CentOS-[^M]*仕事、しかしls *[^M]*ない...
yode

@yode、あなたが正確に無視したいものに依存します:M文字の出現またはMedia単語?
-RomanPerekhrest

しかし、私の場合、そのファイルのみに文字がありMます。
ヨデ

3
パターンは貪欲です。最初の*は最後の文字を除くすべてに一致し、[^ M]は最後の文字に一致します。いずれもMで終了せず、末尾の*は空の文字列に一致します。したがって、それらはすべて一致します。そして、Mで終わるものであっても、Mとは異なる何かがあると仮定して、それでも一致します。たとえば、OOMというファイルがある場合、最初の星は最初のOと一致し、[^ M]は2番目のOと一致しますトレーリングスタートはMと一致します。
NickD

12

いくつかのシェルには、否定グロビング演算子があります。

  • zsh -o extendedglob

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • kshzsh -o kshglobbash -O extglob

    ls -d -- !(*Media*)
    
  • bash

    GLOBIGNORE='*Media*'
    ls -d -- *
    
  • ksh

    FIGNORE='@(*Media|.)*'
    ls -d -- *
    

6

1つのオプションはfind-not -name フラグで使用することです。すなわちfind . -not -name CentOS-Media.repo。ディレクトリ構造を再帰的にたくない場合は、-maxdepth 1フラグを追加します。

または、次のように書くこともできます(はるかに複雑ですが、-notフラグを忘れて元々この回答を投稿したため、この部分は削除しません)。

find . -print0 | grep --invert-match -z "CentOS-Media.repo$" | tr '\0' '\n'

findファイル名の改行が何も壊さないように、ファイル名を強制的にヌルバイトで区切る必要があります。願わくば、grepflagでこの種のセパレータをサポートしてください-z。次のように、通常の区切り(つまり、nullバイト->改行)に戻すことができます。tr '\0' '\n'


1
またprintf '%s\0' *、デフォルトでは再帰せず、ドットファイルを含まないヌル区切りのファイル名を取得できます(ただし、一部のシェルにはオプションがあります)。また-Eその正規表現は必要ありませんが、気難しいようにするには、バックスラッシュを付けるか、に.入れる必要があり[]GNU findとgrepに依存します
dave_thompson_085

4

最も簡単な方法は、findを使用することです。行う:

find . -maxdepth 1 -type f ! -name "CentOS-Media.repo"

ここで、「f」は通常のファイルのみを検索することを意味します(ただし、通常のファイルへのシンボリックリンクは除きます。GNU ではfind-xtype f代わりにそれらを含めるために使用します)。ディレクトリを検索する場合は、代わりに「d」を渡します。

-maxdepth最初はGNU拡張機能が一般的になりました。findサポートしていない場合は-maxdepth 1、標準に置き換えることができます! -name . -prune)。

より優れた機能については、manページを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.