この質問のアドバイスに従って、文字列を再帰的にgrepすることができますstring特定のディレクトリのコンテンツ内dir次のように

grep -r --exclude-dir=".*" string dir 

ただし、これを現在のディレクトリに適用すると、

$ grep -r --exclude-dir=".*" string . $ 

--exclude-dir=".*"オプションは、現在のディレクトリが".*"と一致するため、非表示として省略します。

回避策は、次に、適切な子に対してコマンドを実行してから、cdを元の作業ディレクトリに戻します。ディレクトリを変更する回避策なしでこれを行うために使用できる単一のコマンドが必要です。

コンテンツをgrepする単一のコマンドとは何ですか。現在のディレクトリの、隠しディレクトリの内容を省略しますか?

回答

GNU grep 2.11以降を使用している場合、ディレクトリが指定されていなければ、-rは現在のディレクトリから開始されます:

grep -r --exclude-dir=".*" string 

コメント

  • バージョンノートを含めるのは良いことです。 BSD grepを使用すると、次のように生成されます。grep: warning: recursive search of stdin

回答

シェルグロブ(ファイル名パターンとも呼ばれます)では、.には特別な意味はありません。*は0個以上の文字を意味し、?は任意の1文字を意味します。

除外するのは、ドットとそれに続く少なくとも1つの em 文字、次に任意の数の文字。したがって、次を使用します:

grep -r --exclude-dir=".?*" string . 

回答

はデフォルトでgrep隠しディレクトリをトラバースしません(つまり、dotglobが有効になっていない場合:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

隠しファイルを除外する:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

コメント

  • コメントなしの反対票の背後にある理由について知りたいです。
  • 反対票を投じませんでした'ですが、' grepが隠しディレクトリをトラバースしないことは真実ではありません'あなたが' grep -r foo *で再確認すると、 shell glob *は' dotglobshopt -s dotglobで設定されている場合を除き、div> tを展開して隠しディレクトリ/ファイルを含めます。 grep -r foo .そしてあなた'隠しディレクトリは、grepによってトラバースされます。または、shopt -s dotglobを試してから、grep -r foo *を試してください。
  • フェアポイント。回答でこれを明確にしました。
  • これにより、コマンドライン引数に含まれる隠しディレクトリ内のファイルが引き続き検索されます。それは一種の動作します。ほとんどの場合は問題ありませんが、'は" pi "を定義するようなものです。 as " 3.1416 ";警告をよく知っています。

回答

like:

grep -r --exclude-dir=".*" string "$(pwd)" 

コメント

回答

シングルディレクトリ(サブディレクトリの隠しファイルを制限しない)の使用:

echo dir/*はdir内のすべてのファイルを出力するため、これは一部のdir内のファイルに対して機能します。

$ grep -r "string" $(echo dir/*) 

dir.(ドット)に変更し、必要なものを正確に取得できます。

$ grep -r "string" $(echo ./*) 

必要なのがどのサブディレクトリにも隠しファイルがない場合は、次のいずれかを使用します。

$ grep -r --exclude-dir=".*" "string" 

またはfindを使用します:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です