Respostas:
Use a opção de linha de comando -vou --invert-match,
ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$
grep -v
ou
grep --invert-match
Você também pode fazer o mesmo usando find:
find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)
Mais informações aqui .
findcomando é a solução mais semântica para esse problema XY. Combinar lse greppara esse fim parece, na melhor das hipóteses, hacky. Essa deve ser a resposta aceita. (+1)
Adicione a -vopção ao seu grepcomando para inverter os resultados.
grep "subscription" | grep -v "spec"
Como declarado várias vezes, a inversão é obtida pela -vopção para grep. Deixe-me acrescentar a nota (que espero que seja divertida) de que você mesmo pode ter descoberto isso através do greptexto de ajuda:
grep --help | grep invert
-v, --invert-match seleciona linhas não correspondentes
-v/--invert-matchnão necessariamente mudará se o código de retornogrepindica uma execução bem-sucedida, mas corresponderá às linhas que de outra forma não seriam correspondidas. Aqueles que desejam inverter o código de retorno (ou seja, obter êxito se todas as linhas não corresponderem ao padrão, em vez de pelo menos um), devem usar! grep. Isso encontra usar em expressões condicionais, por exemplo:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi.