Ele parece funcionar bem se você remover as "linhas 1 e 2 quando receber os argumentos:
IN_REGEX=$1
OUT_REGEX=$2
find . -name '*'.cpp | grep $IN_REGEX | grep -v $OUT_REGEX
Eu tenho um repositório inteiro de arquivos e estou tentando obter uma lista de arquivos que correspondem a um determinado critério.
Por exemplo, digamos que eu queira pegar todos os arquivos que tenham a string foo1 e foo2/foo3 no caminho e não tenham bar1 ou bar2/bar3 . Observe que é possível que bar1 ou bar2/bar3 seja um subdiretório de foo* e, nesse caso, esses diretórios também devem ser excluídos . Eu tentei o seguinte método:
IN_REGEX="$1"
OUT_REGEX="$2"
find . -name '*'.cpp | grep $IN_REGEX | grep -v $OUT_REGEX
Eu chamo este script desta maneira:
./script "/foo1/\|/foo2\/foo3/" "/bar1/\|/bar2\/bar3/"
No entanto, o loop nunca é executado. Eu tentei alterar o " nos argumentos da linha de comando para ' . Mas isso não ajudou. Tentei alterar os comandos grep s para sed da seguinte forma:
find . -name '*'.cpp | sed "\m%$IN_REGEX%" | sed "\%$OUT_REGEX%d"
Novamente, não há sucesso. No entanto, quando tento executar o grep no shell bash diretamente. Funciona bem. Eu passei o dia inteiro hoje tentando descobrir isso.
Alguém por favor pode me ajudar?
Você pode usar as opções de comando ! (negate) e -path de find para realizar isso
$ find . \( ! -path "*bar*" -a ! -path "*bar2\/bar3*" -a -path "*foo*" -print \)
Isso pesquisará em pastas excluindo bar , bar2/bar3 e incluindo pastas com foo no caminho. Experimente. A sintaxe pode mudar com versões diferentes do comando find .