この質問のアドバイスに従って、文字列を再帰的に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
コメント
回答
シェルグロブ(ファイル名パターンとも呼ばれます)では、.
には特別な意味はありません。*
は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*
は'dotglob
がshopt -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)"
コメント
- コマンド置換を引用:
"$(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" {} \+
grep
を使用すると、次のように生成されます。grep: warning: recursive search of stdin