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.repo
んCentOS-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]*
M
GNU実装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
find
1つのオプションはロゴで使用することです-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'