たとえば、見てみましょう。
$ 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などの派生物)に基づくシェルを除いてディレクトリを検索するときに苦情が発生することです。fish
pdksh
mksh
posh
sh
grep
.
..
$ 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
、OpenBSDsh
、、posh
...mksh
)とfish
:grep Hello ./.* ./*
rc
、es
: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 ファイルに配置できます。