A ideia de -false
é a chave, IMHO. Estou apenas adicionando a ele:
find . -false $(echo "-o -name *."{sh,pl,sql})
Você acabou de citar tudo para fazer o bash repetir todo o padrão, incluindo -o -name
, e depois "quebrar" o agrupamento feito pela citação retornando-o de uma subcamada. O problema com essa abordagem é que as cotações no padrão não funcionarão.
EDIT: Veja o comentário de Michał Šrajer para outra armadilha desta solução. Note que você não pode simplesmente colocar uma barra invertida antes da estrela: a substituição do comando retorna um *
, que será expandido, ou um \*
, que será passado como está para ser encontrado (!). Pelo menos, é assim que meu bash local funciona.
Isso é o melhor que posso fazer:
(GLOBIGNORE='*:.*'; find . \( -false $(echo "-o -name *."{sh,pl,sql,xml}) \) -print)
Boa sorte:)
Btw, se você estiver não adicionando mais parâmetros a find
, é claro que use apenas xargs
; Nesse caso, funciona perfeitamente, com citações e tudo:
echo "-o -name *."{sh,pl,sql} | xargs find . -false