0

現在のディレクトリ内のすべてのファイルを検索して、「エラー」という単語を含む行を検索する単純な egrep コマンドがあります。

egrep -i "error" * 

このコマンドは、サブディレクトリも通過します。フォルダ全体がどのように見えるかのサンプルを次に示します。

/Logfile_20120630_030000_ID1.log
/Logfile_20120630_030001_ID2.log
/Logfile_20120630_030005_ID3.log
/subfolder/Logfile_20120630_031000_Errors_A3.log
/subfolder/Logfile_20120630_031001_Errors_A3.log
/subfolder/Logfile_20120630_031002_Errors_A3.log
/subfolder/Logfile_20120630_031003_Errors_A3.log

最上位ディレクトリのログファイルには、「エラー」行が含まれています。しかし、「サブフォルダー」ディレクトリ内のログファイルには、「エラー」のある行は含まれていません。(ファイル名のみ)

したがって、私が得ている問題は、egrep コマンドが「サブフォルダー」内の情報を見ているように見えることです。私の結果は、バイナリブロックと思われるもののチャンクを取得し、次にトップフォルダーのログファイルから「エラー」という単語を含むテキスト行を取得します。

「サブフォルダー」の下にあるすべてのファイルを削除しても、フォルダー自体を削除しなかった場合、まったく同じ結果が得られます。

では、Unix はファイル履歴情報をフォルダー内に保持しますか??

この問題は次を実行することで修正されました: find . -タイプ f | egrep -i "エラー" *

しかし、なぜそれが問題だったのか、私はまだ理解していません。SunOS で C シェルを実行しています。

4

1 に答える 1

1
egrep -i error *

メタ文字は任意の*ファイル名と一致します。ディレクトリもファイルです。 *シェルによって現在のディレクトリ内のすべてのファイルに展開されます。これは従来、グロブと呼ばれていました。

set noglob

その動作をオフにします。ただし、*ディレクトリに名前が付けられたファイルが存在する可能性は低いため、この例では、コマンドはどのような種類のファイルも検出しません。*ところで-これをテストするために名前が付けられたファイルを作成しないでください。名前が付けられたファイル*は、あらゆる種類の興味深く望ましくないことが起こる可能性があるためです。ファイルを削除しようとするとどうなるか考えてみてください。 rm '*' 正しいコマンドですが、あなたや他の誰かがrm *思いがけずやった場合は、問題が発生します...

于 2012-07-10T12:51:54.963 に答える