grep はドットで始まるファイルを無視します。

grep はドットで始まるファイルを無視します。

たとえば、見てみましょう。

$ echo Hello > file1
$ echo Hello > file2
$ echo Hello > .file3
$ grep Hello * 2>/dev/null
file1:Hello
file2:Hello

.file3ここでgrepが無視されるのを見ることができます。.

予想される結果:

$ grep Hello * 2>/dev/null
.file3:Hello
file1:Hello
file2:Hello

で始まる項目を無視しないようにするlsパラメータがあります。-a.grep

grepそれでは、で始まる項目を無視しないようにする方法はありますか.?それとも、なぜgrep無視するのですか?

答え1

*ファイル名拡張子の前のピリオドと一致しません.このルールは POSIX によって指定されます。

パターンマッチングを使用すると、次のように動作します。

$ sh -c 'case . in *) echo 1;; esac'
1

POSIX的に:

find . ! -name . -prune -type f -exec grep 'pattern' /dev/null {} +

このアプローチは、シェルワイルドカードを使用するよりも利点があります。あなたは決して得られないでしょうパラメータリストが長すぎます。ファイルが多すぎるとエラーが発生します。

答え2

他の人が言ったように、*globにはデフォルトで隠されたファイル(名前がドットで始まるファイル)は含まれていません。この問題を解決する簡単な方法は、2つの地球儀を使用することです。

grep Hello * .*

欠点は、Forsythシェルまたはzshシェル(現在はOpenBSDやOpenBSDなどの派生物)に基づくシェルを除いてディレクトリを検索するときに苦情が発生することです。fishpdkshmkshposhshgrep...

$ grep Hello * .*
file1:Hello
file2:Hello
grep: .: Is a directory
grep: ..: Is a directory
.file3:Hello

これらのエラーを無視するか(この場合は重要ではありません)、単純なループを使用してターゲットが通常のファイルであることを確認できます(シンボリックリンクの確認後)。

$ for file in .* *; do [ -f "$file" ] && grep -H -- Hello "$file"; done 
.file3:Hello
file1:Hello
file2:Hello

答え3

.そして、以下を除いて隠しファイルを含むグローブの場合..

  • zsh:

    grep Hello ./*(D)
    

    ./(で始まるファイル名も必要です-。)または:

    (set -o dotglob; grep Hello ./*)
    

    globのもう1つの利点zshは、通常のファイルのみが必要であることを指定できることです(.glob修飾子を使用して)。

    grep Hello ./*(D.)
    
  • ksh93:

    (FIGNORE='.?(.)'; grep Hello ./*)
    
  • bash:

    (shopt -s dotglob; grep Hello ./*)
    
  • tcsh:

    (set globdot; grep Hello ./*)
    
  • fish:

    grep Hello {.,}*
    
  • Forsythシェルとその派生物(pdksh、OpenBSD sh、、posh... mksh)とfish

    grep Hello ./.* ./*
    
  • rces

    grep Hello ./.[~.]* ./..?* ./*
    
  • Bourneシェル、ksh88、およびAlmquistシェル派生物:

    grep Hello ./.[!.]* ./..?* ./*
    
  • csh:

    grep Hello ./.[^.]* ./..?* ./*
    

zsh(t)cshおよびを使用するfishと、globがファイルと一致しない場合、コマンドは実行されません。他のシェルでは、一致しないglobがそのまま渡され、grepそのgrepファイルが存在しないという苦情が表示されます。

答え4

*他の人は、ドットで始まるファイルが一致しないと正しく言いました。さまざまな解決策が多くの答えに提供されており、ほとんどはいくつかの穴があります(例:.&..;インクルードまたは複数の点で始まるファイルを除外、サブディレクトリを含める、非常に長いコマンドを含む - OK)。これらすべては以下を提供します。問題のいくつかの新しい視点。

(bashユーザーのための)私の簡単な解決策は次のとおりです。shopt -s dotglob*globにドットファイルを含めるようにbashに指示するには、これを使用します。
POSIXの互換性や他のシェルを使用する場合は、他の答えが役に立つことを願っています。
shopt -s dotglobソリューションのハイライト:含まれていません。そして..;サブディレクトリを再帰的に含めません。 .bashrc ファイルに配置できます。

関連情報