2つのキーワードを含むすべてのファイルおよび/またはパスを見つける安定した方法は何ですか?

2つのキーワードを含むすべてのファイルおよび/またはパスを見つける安定した方法は何ですか?

やっていた

find . -iname '*sitesearch*' | grep demo

ファイルがなければならないことを知っていますが、some/path/SiteSearch/demo/SiteSearch.html誰かがファイルをに入れてsome/path/SiteSearch/demo/index.htmlファイルを見つけることができないことがわかりました。

検索を実行するより良い方法はありますか?

たとえば、この例では

find . -iname '*demo*' | grep -i sitesearch

それを見つけるでしょう。しかし、いつもそれがどんな可能性であるかを考え、どのパターンを使うべきかを知りたくありません。ファイルとパスにこれらの両方のキーワードがある場合はいつでも印刷できる方法が必要です。たとえば、lsすべてのファイルの各行のフルパスを提供する方法がある場合は、次のようにします。

ls --some-flags | grep -i demo | grep -i sitesearch

または他の方法/より良い方法かもしれません。

ベストアンサー1

では、2つのパターン(またはより一般的には複数の条件)を組み合わせることができますfind

find . -ipath '*sitesearch*' -ipath '*demo*'

または正規表現の構文を好む場合

find . -iregex '.*sitesearch.*' -iregex '.*demo.*'

ls各行のフルパス」(ここでは明らかに必要なディレクトリを再帰的に移動することを含む)はですfind。実行することはできますが、find | grep -i demo | grep -i sitesearchすべてのことを行うのはfindおそらくはるかに高速です。

これを頻繁に実行する場合は、関数にすることができます(~/.kshrcまたは~/.bashrc中に入れます~/.zshrc)。

findallof () {
  typeset -a pred
  pred=(.)
  typeset x
  for x do
    pred=("${pred[@]}" -ipath "*$x*")
  done
  find "${pred[@]}"
}

また、以下を使用して名前でファイルを検索できます。locate(Linux にも複数の実装がありますので、システムのマニュアルページをご確認ください.)

locate -i sitesearch | grep -i demo

locateこれはインデックスが照会されるため、大きなディレクトリツリーを検索するよりも高速です(大文字と小文字を区別しない検索はそれほど高速ではない傾向があります)。ただし、インデックスは通常夜のみに書き換えられるため、今日作成されたファイルは表示されません。パブリックに読めるディレクトリにないファイルは、実装によって索引付けされたり、そうでない場合があります(/usr/bin/locatesetuidルートバイナリであることを確認してください。そうであれば、個人ファイルは索引付けされ、コマンドはlocateアクセス可能なファイルのみを表示します)。

おすすめ記事