やっていた
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/locate
setuidルートバイナリであることを確認してください。そうであれば、個人ファイルは索引付けされ、コマンドはlocate
アクセス可能なファイルのみを表示します)。