A opção -name
nunca funcionará após o primeiro /
. Como sempre, as páginas man são seus amigos:
-path pattern
True if the pathname being examined matches pattern. Special shell pattern matching characters
(''['', '']'', ''*'', and ''?'') may be used as part of pattern. These characters may be
matched explicitly by escaping them with a backslash (''\''). Slashes (''/'') are treated as
normal characters and do not have to be matched explicitly.
Eu geralmente prefiro a compatibilidade com o GNU find e, portanto, uso a opção -wholename
. Note que estes também existem no modo sem distinção entre maiúsculas e minúsculas: -iwholename
e -ipath
.
Então, no seu caso, você faria (lembre-se que wholename corresponde ao caminho todo , então você deve adicionar o curinga *
no começo):
karolos$ find basedir -type f
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
basedir/16yyyy/EX3.XML
basedir/16yyyy/EX4.XML
karolos$ find basedir -wholename "*16xxxx/*.XML"
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
Outra maneira de conseguir o que você deseja é usar o find em combinação com grep
(note que eu tive que alterar a expressão regular, adicionando um .
(para qualquer caracter) antes do curinga *
):
karolos$ find basedir | grep '16xxxx/.*.XML'
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
Por fim, dependendo das suas necessidades, existe até a possibilidade de você não precisar usar find
(se você não precisar da flexibilidade extra). Você pode então usar bash
expansão de nome de arquivo da seguinte forma:
karolos$ echo basename/*16x*/*XML
basename/16xxxx/EX1.XML basename/16xxxx/EX2.XML