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
.