Isso depende muito da sua implementação de locate . Esse não é um comando padrão e existem algumas implementações diferentes com diferenças bastante significativas.
-
Existe uma implementação no GNU findutils.
Com esse:
locate -i word1 word2localiza os arquivos cujo caminho contém
word1ouword2case insensivelmente enquantolocate -Ai word1 word2localiza arquivos cujo caminho contém ambos.
Ele também suporta uma opção
--regexe--regextypecomo para o GNU %código%. Por definição, isso éfindestilo regexps, alguma forma de híbrido entre BRE e ERE.Com esse, você poderia fazer:
locate -ir 'word1.*word2\|word2.*word1' -
A implementação de
emacs(o padrão no Debian e derivados) também suportamlocate. Tem-A/-r, mas não--regexe seus REs são expressões regulares básicas. Nos sistemas como os GNU cujos BREs suportam--regextypepara alternação como extensão, você também pode fazer:locate -ir 'word1.*word2\|word2.*word1' -
o ast-open tem um script de wrapper
\|, bem como um script ksh93 em torno delocate(o sucessor detw) . Não suportafindnem-A, mas você pode usar todo o poder dos curingas-r, então você pode usar por exemplo operadores de look-perl-like com:locate '~(Pi:^(?=.*word1)(?=.*word2))'Ou
ksh93ksh93glob operator:locate -i '*word1*&*word2*'É particularmente lento em comparação com os outros, embora o padrão não está ancorado. É melhor depois de ancorar (
&eft elight) é restaurado com:locate -i '~(lr)*word1*&*word2*'
Um problema com o piping para r é que ele não funciona para o caminho do arquivo que contém caracteres de nova linha. Com o GNU locate ou mlocate, você pode usar a opção grep para usar registros delimitados por NUL que você pode usar em combinação com a opção -0 do GNU -z :
locate -i0 word1 | grep -z word2 | grep -z word3 | tr 'locate -i0 word1 | awk -v RS='locate -i0 word1 | perl -ln0e 'print if /word2/ && /word3/'
' '/word2/ && /word3/'
' '\n'
Ou grep no GNU gawk ou no -v RS=' de ThomasDickey: mawk'
locate -i word1 word2
Ou perl -ln0 :
locate -Ai word1 word2