すべての隠しディレクトリを省略し、現在のディレクトリの内容を再帰的に把握する方法は?

すべての隠しディレクトリを省略し、現在のディレクトリの内容を再帰的に把握する方法は?

以下のアドバイスに従ってください。これ質問、次のように、指定されたstringディレクトリの内容から文字列を再帰的に見つけることができます。dir

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

ただし、次のように現在のディレクトリに適用すると、

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

--exclude-dir='.*'このオプションは、現在のディレクトリが一致するため隠されたものと無視されるため、結果は得られません'.*'

回避策は、親ディレクトリに変更してからcd ..そのサブディレクトリからコマンドを実行し、元のcd作業ディレクトリに戻ります。ディレクトリを変更せずにこれを実行するために使用できるコマンドを使用する回避策が必要です。

現在のディレクトリの内容を特定し、隠されたディレクトリの内容を無視する単一のコマンドは何ですか?

答え1

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

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

答え2

シェル glob (ファイル名パターンとも呼ばれる) では.特別な意味がなく、*ゼロ個以上の文字を表し、?単一文字を表します。

除外する項目は次の点です。最後のもの文字の後に任意の数の文字が続きます。したがって、以下を使用してください。

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

答え3

隠されたディレクトリはデフォルトでナビゲートされbashないため(つまり、アクティブではありません)grepdotglob

$ 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

答え4

内から再帰一つディレクトリ(サブディレクトリの隠しファイルを制限しない)を使用する:

echo dir/*ディレクトリ内のすべてのファイルが印刷されるように、特定のディレクトリ内のファイルにも適用されます。

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

dir(点)に変更すると、.欲しいものが得られます。

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

サブディレクトリに隠しファイルがない場合は、以下を使用してください。

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

または検索を使用してください。

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

関連情報