Grep Excluir múltiplos CSV de dirs não funcionando

1

Estou tentando grep da palavra world , excluindo todos os diretórios que são mail , tmp ou .cpanel . Eu posso ignorá-los individualmente usando o --exclude-dir=name , mas da leitura de outros tópicos parece que eu deveria ser capaz de usar uma lista separada por vírgulas. No entanto, não tive sorte tentando:

grep 'world' --exclude-dir={./mail,./.cpanel,./tmp} -ri .

e

grep 'world' --exclude-dir={mail,.cpanel,tmp} -ri .

como nenhum trabalho. Usar --exclude-dir com apenas um diretório funciona, como em:

grep 'world' --exclude-dir=mail -ri .

mas recebo de volta tmp can .cpanel listagens.

Como posso especificar todos os dirs em um comando (assim que eu obtiver o .cpanel e tmp excluídos, suspeito que possa haver mais alguns diretórios irrelevantes, portanto, não quero ter um --exclude-dir por diretório) .

    
por chris85 15.04.2017 / 19:44

2 respostas

2

exclude-dir é grep dependente da versão

A bandeira foi introduzida foi introduzida com > 2.5.2 :

+Version 2.5.2
+  - The new option --exclude-dir allows to specify a directory pattern 
+    that will be exclided (sic) from recursive grep.

(H / T para resposta da Johnsyweb sobre SO para rastrear a versão )

Quando implementado, ele funciona como uma lista regular de diretórios separados por vírgula a serem excluídos, sem espaços:

$ grep 'foo' -ri .                                                      
./a/test.txt:foo bar baz
./c/test.txt:foo bar baz
./b/test.txt:foo bar baz

$ grep 'foo' --exclude-dir={a,b} -ri .                                                      
./c/test.txt:foo bar baz

Alternativa, se sua versão de grep não der suporte a {} e você não quiser continuar digitando diretórios

Coloque os diretórios em uma matriz e expanda-os para o comando:

$ exclude=( "mail" ".cpanel" "tmp" )
$ for dir in ${exclude[@]}; do echo "--exclude-dir=$dir"; done

--exclude-dir=mail
--exclude-dir=.cpanel
--exclude-dir=tmp

Use como abaixo:

$ grep 'world' $(for dir in ${exclude[@]}; do echo "--exclude-dir=$dir"; done) -ri .

Explicação : a substituição $() colocará seus --exclude-dir s como argumentos no grep grep .

    
por 15.04.2017 / 21:32
2

O seguinte pode ou não ser uma resposta correta, dependendo da sua definição de comando:

grep -iR 'world' . | grep -v mail | grep -v ".cpanel" | grep -v tmp

(Na verdade, tenho certeza de que ".cpanel" não precisa de citações. Mas tenho a tendência de fazer as coisas seguras, então, em vez de tentar lembrar de todas as nuances, se houver alguma pontuação, então tento citá-la .)

Se a sua definição de "comando" é quando um executável é especificado, então são quatro comandos e não respondem à pergunta. No entanto, se a sua definição de "comando" é baseada em quando você pressiona "enter", ou se você diz que existem 5 comandos que (um comando que contém 4 outros comandos), então eu forneci com sucesso um único comando que faz o que você perguntei. (Além disso, em vez de depender de uma extensão GNU chamada --exclude-dir, essa abordagem funciona em mais sistemas operacionais.)

    
por 15.04.2017 / 23:09