locate
findutils
私はしばしば次の(from)パイプを使用して、パス名に特定の順序ではなく、2つの単語とを含むgrep
ファイルword1
を見つけます。word2
locate -i word1 | grep -i word2
パイプラインではなく単一のコマンドのみを使用してこれを実行する方法が疑問に思います。これは私のパイプコマンドよりも優れたアプローチですか?
locate
検索パターンを定式化できるいくつかの正規表現がサポートされていますか?
ありがとうございます。
答え1
これは実装によって大きく異なりますlocate
。これは標準的なコマンドではなく、実装方法によって大きな違いがあります。
GNU findutilsに実装があります。
それで:
locate -i word1 word2
word1
パスに大文字と小文字が含まれているファイルや大文字と小文字word2
が区別されないファイルを検索するlocate -Ai word1 word2
パスに両方が含まれているファイルを見つけます。
また、GNUに似た
--regex
オプションもサポートしています。デフォルトでは、これはBREとEREの間の一種のハイブリッド形式の-style正規表現です。--regextype
find
emacs
これにより、次のことができます。
locate -ir 'word1.*word2\|word2.*word1'
実装
mlocate
(Debianとその派生製品の基本実装)またサポートされます-A
。-r
/--regex
はありますが、--regextype
REはデフォルトの正規表現です。 BREが代替拡張をサポートするGNUなどのシステムでは、\|
次のこともできます。locate -ir 'word1.*word2\|word2.*word1'
ast-openには
locate
ラッパースクリプトとksh93ラッパースクリプトtw
(かつてast-openの後続スクリプトfind
)があります。。-A
norはサポートしていませんが、-r
ワイルドカードのすべての機能を使用できるため、ksh93
Perlなどの予測演算子を使用できます。locate '~(Pi:^(?=.*word1)(?=.*word2))'
Or
ksh93
の&
グローバル演算子:locate -i '*word1*&*word2*'
このモードは固定されていませんが、他のモードと比較して特に遅いです。アンカーリング(
l
左右r
)が復元されると、はるかにうまく機能します。locate -i '~(lr)*word1*&*word2*'
パイプ接続の問題grep
はい、改行文字を含むファイルパスでは機能しません。このオプションをGNUlocateまたはmlocateと一緒に使用すると、NULで区切られたレコードを使用でき、-0
GNUオプションと一緒に使用することもできます。-z
grep
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/'