Como posso encontrar um arquivo cujo nome inclua uma determinada string, como “abcde”?

7

Dentro de um conjunto de diretórios, como faço para encontrar um arquivo cujo nome inclui uma determinada string, como "abcde"?

    
por user297850 01.08.2011 / 05:13

4 respostas

13

find examinará uma estrutura de diretórios e retornará resultados com base em um globo :

find /your/dir -name "*abcde*"

A adição da opção -type f irá refinar seus critérios de pesquisa para retornar apenas arquivos.

find /your/dir -type f -name "*abcde*"

Você também pode incluir outras opções como -maxdepth 2 para restringir a pesquisa a dois níveis de diretórios abaixo do especificado.

Dessa forma, você pode criar um comando de pesquisa rico e altamente segmentado que retornará rapidamente exatamente o que você precisa.

man find tem muitos detalhes, incluindo ações como -exec para executar um comando nos arquivos retornados por find e opções para usar expressões regulares.

    
por 01.08.2011 / 05:30
5

Use encontre :

find path-to-search -name '*abcde*'
    
por 01.08.2011 / 05:29
3

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 "|"    |
#
    
por 01.08.2011 / 06:17
1
locate abcde | egrep "(dirA|dirB|dirC)" 

para o conjunto de diretórios dirA, dirB, dirC.

Ou 3 comandos de localização.

    
por 01.08.2011 / 05:35