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

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

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.repoしかし、実際に私はただ知りたかったのですが、そうではありませCentOS-Debuginfo.repoCentOS-Vault.repoでしたCentOS-Media.repo。だからこのコマンドを実行します。

ls [^\(Media\)]

ところで、エラーメッセージが表示されます。どうすればいいですか?

答え1

一部のシェルには負のワイルドカードがあります。

  • zsh -o extendedglob:

    ls -d -- ^*Media*
    ls -d -- *.repo~*Media* # ~ is "except" operator
    
  • ksh, zsh -o kshglob, bash -O extglob:

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

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

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

答え2

最も簡単な場合は、次のものを使用できます(最初のサブワードが静的である場合CentOS)。

ls CentOS-[BDV]*

  • [BDV]- 2番目のサブワードが指定された文字の1つで始まることを確認する文字クラス

または同じ否定的な:

ls CentOS-[^M]*

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

ls -I '*M*'

-i,--無視=模様
シェルに一致する暗黙の項目をリストしない模様

Media単語を含む項目を無視するには、次のようにします。

ls -I '*Media*'

これらのパターンはそのまま渡す必要があるため、引用符lsで囲む必要があります(そうしないと、シェルはそれを拡張するグローバル変数として扱います)。

答え3

最も簡単な方法は検索を使用することです。する:

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

ここで、「f」は検索を意味する。一般ファイル(ただし、通常のファイルへのシンボリックリンクは含まれていません。GNUの場合はシンボリックリンクを含めるためにfind使用されます-xtype f。)ディレクトリを検索するには、「d」を渡します。

-maxdepth元のGNU拡張が一般的でfindサポートされていない場合は、-maxdepth 1標準に置き換えることができます! -name . -prune。)

よりマニュアルページを探す素晴らしい機能の詳細をご覧ください。

答え4

find1つのオプションはロゴで使用することです-not -name 。つまりfind . -not -name CentOS-Media.repo-maxdepth 1再帰的なディレクトリ構造が必要ない場合は、フラグを追加してください。

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

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

findファイル名の改行によって内容が中断されないように、ファイル名をnullバイトで区切る必要があります。grepフラグを含む区切り文字がサポートされていることを願っています-z。一般的な区切り(たとえば、ヌルバイト - >新しい行)に戻したい場合があります。tr '\0' '\n'

関連情報