localiza todos os arquivos cpp e lista apenas os arquivos com nomes que correspondem a um padrão (regex) não funciona

2

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?

    
por Karthick S 01.03.2013 / 10:10

2 respostas

0

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
    
por 01.03.2013 / 11:14
4

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 .

Consulte ache a man page para mais detalhes .

    
por 01.03.2013 / 11:24

Tags