Como pesquisar arquivos por padrão de combinação de nome de diretório e arquivo

0

Eu quero encontrar todos os arquivos .xml em todos os diretórios e subdiretórios com o nome 'metadata' no sistema de arquivos. Existe uma maneira de pesquisar por padrão semelhante a

find . -name  */metadata/*.xml" (mixing find command and Gradle paralance)

?

    
por akirekadu 15.02.2017 / 01:15

3 respostas

3
$ find / -path "*/metadata/*" -name "*.xml"

ou, dependendo das suas necessidades, apenas

$ find / -path "*/metadata/*.xml"

Estes não são os mesmos embora.

  • O primeiro deles localizará todos os arquivos com um sufixo .xml com um caminho que contenha um diretório metadata . Os arquivos podem ter vários níveis abaixo desse diretório.

  • O segundo encontrará todos os arquivos com um sufixo .xml localizados em um diretório metadata .

Observação: estou usando / como você disse "no sistema de arquivos", que eu interpretei como "em qualquer lugar".

Como alternativa, usar locate (só encontrará arquivos acessíveis para todos os usuários):

$ locate "/metadata/" | grep '\.xml$'

(Isso funcionará um pouco como o primeiro find acima)

    
por 15.02.2017 / 10:41
0

Isso é meio desleixado, mas enquanto você estiver no diretório pai de sua escolha, você pode tentar

grep -nr "*metadata/*xml" .
    
por 15.02.2017 / 01:17
0

O que você precisa perceber é que o nome em 'find' é realmente o 'basename' Assim, para obter o nome real do arquivo, podemos executar uma descoberta aninhada em que primeiro localizamos um diretório cujo nome é 'metadata' e, em seguida, procuramos por qualquer arquivo * .xml no diretório:

find . -type d -name metadata -exec sh -c '
shift $1;
while case $# in 0 ) break;; esac; do
   find "${1}/." ! -name . -prune -type f -name \*.xml
   shift
done
' 2 1 {} +
    
por 15.02.2017 / 13:11