Se locate
combina com você (é rápido, mas tão bom quanto a execução mais recente de sudo updatedb
). Você pode executar locate
usando seu próprio recurso de regex interno ...
Aqui está um script orientado por parâmetros para fazer o que você deseja. Chamá-lo com $ 1 como o "abcde" que você está procurando e com parâmetros subseqüentes como os diretórios:
#!/bin/bash
a=("$@"); r=''
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
locate --regex "(${r:1}).*/[^/]*${a[0]}[^/]*$"
Um exemplo de uma chamada é assim:
$ ./script_name 'z' "$HOME/bin/perl" "$HOME/type/stuff"
Como sugerido por jasonwryan , aqui está uma versão comentada do script.
Tenha em mente que locate
sempre produz caminhos totalmente qualificados.
#!/bin/bash
# Note: Do not use a trailing / for directory names
#
# Any of the args can be an extended regex pattern.
#
# Create an array 'a' which contains "$1", "$2", "$3", etc... (ie. "$@")
# writing the $-args to an array like this (using quotes) solves
# any possible problem with embedded whitespace
a=("$@")
#
# Set up an empty string which is to be built into a regex pattern
# of all directroy names (or an appropriate regex pattern)
r=''
#
# Each regex pattern is to be an extended regex
# Each regex pattern is concatenated to the preceding one
# with the extended-regex 'or' operator |
#
# Step through the array, starting at index 1 (ie, $2),
# and build the 'regex-pattern' for the directories
for ((i=1;i<${#a[@]};i++)); do r="$r|${a[i]}"; done
#
# Run 'locate' with
# |the target file pattern $1 |
# |zero-to-| |preceded and followed by |
# |-many | |zero-to-many non-slash chars|
# |anything| | |‾‾‾‾‾‾‾‾‾‾‾‾
# ‾‾‾‾‾‾‾|| | |
locate --regex "(${r:1}).*/[^/]*${a[0]}[^/]*$"
# ________| | |
# |directory-regex| last
# | in brackets ()| slash
# |stripped of its|
# |leading "|" |
#