4

名前に大文字のみが含まれているディレクトリ内のすべてのエントリを一覧表示しようとしています。ディレクトリには「/」を追加する必要があります。

#!/bin/bash
cd ~/testfiles/
ls | grep -r *.*

grep はデフォルトで大文字のみを検索するので (そうですか?)、testfiles の下のディレクトリを再帰的に検索して、大文字のみを含むすべての名前を探します。

残念ながら、これは機能しません。

ディレクトリの追加に関しては、なぜこれを行う必要があるのか​​ わかりません。grepで何ができるかについての詳細な説明をどこから始めればよいか知っている人はいますか? さらに、私の問題に取り組む方法は?

4

3 に答える 3

1

いいえ、grep は大文字だけを考慮するわけではありません。

たとえば、あなたの質問は少しわかりません。

  • -r オプションの使用法から、再帰的に検索したいようですが、そうは言いません。簡単にするために、その必要はないと思います。再帰が必要な場合は、@twm の回答を検討してください。
  • 大文字 (文字) のみを検索します。それは、他の(文字以外の)文字を受け入れたくないということですか?ただし、ファイル名には有効です(数字、ダッシュ、ドットなど)。
  • 行ごとにファイルを1つだけ持つことは許可されていないとは言わないので、問題ないと思います(したがって、を使用しますls -1

素朴な解決策は次のとおりです。

ls -1 | grep "^[[:upper:]]\+$"

つまり、大文字のみを含むすべての行を印刷します。たとえば、次のように出力される TEMP ディレクトリに:

ALLBIG
LCFEM
WPDNSE

README.TXTただし、これにより、またはのようなファイルが除外されます。これらのファイルFILE001は、要件 (上記を参照) によっては含まれる可能性が高いです。

したがって、より良い解決策は次のようになります。

ls -1 | grep -v "[[:lower:]]\+"

つまり、小文字を含まないすべての行を出力します。たとえば、TEMPディレクトリに次のように出力されます。

ALLBIG
ALLBIG-01.TXT
ALLBIG005.TXT
CRX_75DAF8CB7768
LCFEM
WPDNSE
~DFA0214428CD719AF6.TMP

最後に、末尾に「/」を付けてディレクトリを「適切にマーク」するには、-F(または--classify) オプションを使用できます。

ls -1F | grep -v "[[:lower:]]\+"

繰り返しますが、出力例:

ALLBIG
ALLBIG-01.TXT
ALLBIG005.TXT
CRX_75DAF8CB7768
LCFEM/
WPDNSE/
~DFA0214428CD719AF6.TMP

find別の出力 (例: ) を使用できる場合は、別のオプションを使用することに注意してください。ただし、find ! -regex ".*[a-z].*"別の出力になります。

于 2013-02-05T19:51:58.607 に答える
0

これlsは、ではなくファイルを一覧表示するgrepため、ディレクトリに「/」を追加することを指定する必要があります。ls --classifyディレクトリに「/」を追加するために使用します。

grep(または一般的に言えば、他のソースからの)結果を処理するために使用され、ls指定したパターンに一致する行のみを表示します。大文字に限定されません。大文字と「/」だけに制限するgrep -E '^[A-Z/]*$か、数字やピリオドなども必要な場合は、代わりに小文字を含む行を除外することができますgrep -v -E [a-z]

grepファイルを一覧表示するプログラムではないため、再帰を実行する場所ではありません 。lsを使用すると、パスを再帰的にリストできますls -R。ただし、その方法でファイルパスの最後のコンポーネントを取得するだけです。

find再帰を処理するためにを使用することを検討することをお勧めします。これは私のために働きます:

find . -exec ls -d --classify {} \; | egrep -v '[a-z][^/]*/?$'

ls --classifyディレクトリの末尾に「/」を追加するために使用すると、分類できる他のタイプのパスに他の文字が追加される場合があることに注意してください。たとえば、実行可能ファイルの末尾に「*」を追加する場合があります。それがOKではないが、ディレクトリと他のパスを別々にリストすることで問題がない場合、これは2回実行することで回避できます。1find回はディレクトリに対して、次にもう1回は他のパスに対して実行します。これは私のために働きます:

find . -type d | egrep -v '[a-z][^/]*$' | sed -e 's#$#/#'

find . -not -type d | egrep -v '[a-z][^/]*$'

于 2013-02-05T19:51:23.567 に答える
0

正確な正規表現は、ls コマンドの出力形式によって異なります。ls にエイリアスを使用しないと仮定すると、これを試すことができます。

ls -R  | grep -o -w "[A-Z]*"

-Rls を使用すると、現在のディレクトリの下にあるディレクトリとファイルを再帰的に一覧表示することに注意してください。grep オプション-oは、テキストの一致した部分のみを出力するように grep に指示します。オプションは、-wgrep に単語全体のみの一致と見なすように指示します。は"[A-Z]*"、大文字の単語のみをフィルタリングするための正規表現です。

この正規表現は、TEST.txt と TEXT.TXT を出力することに注意してください。つまり、文字で形成された名前のみが考慮されます。

于 2013-02-05T19:43:49.907 に答える