以下のアドバイスに従ってください。これ質問、次のように、指定された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
ないため(つまり、アクティブではありません)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
答え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" {} \+