検索とgrepパイプラインを使用したパス名によるファイル検索が改善されました。

検索とgrepパイプラインを使用したパス名によるファイル検索が改善されました。

locatefindutils私はしばしば次の(from)パイプを使用して、パス名に特定の順序ではなく、2つの単語とを含むgrepファイルword1を見つけます。word2

locate -i word1 | grep -i  word2

パイプラインではなく単一のコマンドのみを使用してこれを実行する方法が疑問に思います。これは私のパイプコマンドよりも優れたアプローチですか?

locate検索パターンを定式化できるいくつかの正規表現がサポートされていますか?

ありがとうございます。

解決findhttps://unix.stackexchange.com/a/448006/674

答え1

これは実装によって大きく異なりますlocateこれは標準的なコマンドではなく、実装方法によって大きな違いがあります。

  1. GNU findutilsに実装があります。

    それで:

    locate -i word1 word2
    

    word1パスに大文字と小文字が含まれているファイルや大文字と小文字word2が区別されないファイルを検索する

    locate -Ai word1 word2
    

    パスに両方が含まれているファイルを見つけます。

    また、GNUに似た --regexオプションもサポートしています。デフォルトでは、これはBREとEREの間の一種のハイブリッド形式の-style正規表現です。--regextypefindemacs

    これにより、次のことができます。

    locate -ir 'word1.*word2\|word2.*word1'
    
  2. 実装mlocate(Debianとその派生製品の基本実装)またサポートされます-A-r/--regexはありますが、--regextypeREはデフォルトの正規表現です。 BREが代替拡張をサポートするGNUなどのシステムでは、\|次のこともできます。

    locate -ir 'word1.*word2\|word2.*word1'
    
  3. ast-openにはlocateラッパースクリプトとksh93ラッパースクリプトtw(かつてast-openの後続スクリプトfind)があります。-A norはサポートしていませんが、-rワイルドカードのすべての機能を使用できるため、ksh93Perlなどの予測演算子を使用できます。

    locate '~(Pi:^(?=.*word1)(?=.*word2))'
    

    Orksh93&グローバル演算子:

    locate -i '*word1*&*word2*'
    

    このモードは固定されていませんが、他のモードと比較して特に遅いです。アンカーリング(l左右 r)が復元されると、はるかにうまく機能します。

    locate -i '~(lr)*word1*&*word2*'
    

パイプ接続の問題grepはい、改行文字を含むファイルパスでは機能しません。このオプションをGNUlocateまたはmlocateと一緒に使用すると、NULで区切られたレコードを使用でき、-0GNUオプションと一緒に使用することもできます。-zgrep

locate -i0 word1 | grep -z word2 | grep -z word3 | tr '\0' '\n'

または-v RS='\0'GNU gawkまたは@ThomasDickeyからmawk

locate -i0 word1 | awk -v RS='\0' '/word2/ && /word3/'

またはperl -ln0:

locate -i0 word1 | perl -ln0e 'print if /word2/ && /word3/'

関連情報