Supressa linhas de saída específicas de um comando

0

Eu queria pesquisar todos os arquivos que começam com chrom no diretório /var . Então eu executei isso

$ ls -R | grep "^chrom"

Para meu espanto, Mostrou este . Algumas linhas de partida são assim:

amit@ElMaverick:/var$ ls -R | grep "^chromium"

chromium-browser_55.0.2883.87-0ubuntu0.16.04.1263_amd64.deb
chromium-browser-l10n_55.0.2883.87-0ubuntu0.16.04.1263_all.deb
chromium-codecs-ffmpeg-extra_55.0.2883.87-0ubuntu0.16.04.1263_amd64.deb
ls: cannot open directory './cache/apt/archives/partial': Permission denied
ls: cannot open directory './cache/cups': Permission denied
ls: cannot open directory './cache/ldconfig': Permission denied
chromium-browser_chromium-browser.png
chromium-browser_chromium-browser.png
chromium-bsu_chromium-bsu.png
chromium-browser_chromium-browser.png
ls: cannot open directory './lib/apt/lists/partial': Permission denied
ls: cannot open directory './lib/bluetooth/78:0C:B8:46:10:D5': Permission denied
chromium-browser.conffiles
chromium-browser-l10n.list
chromium-browser-l10n.md5sums
chromium-browser.list
chromium-browser.md5sums
chromium-browser.postinst
chromium-browser.prerm
chromium-codecs-ffmpeg-extra.list
chromium-codecs-ffmpeg-extra.md5sums
ls: cannot open directory './lib/mysql': Permission denied
ls: cannot open directory './lib/mysql-files': Permission denied

Eu não quero ver essas linhas na saída.

ls: cannot open directory

Então, eu tenho 2 perguntas aqui:

  1. Como filtrar apenas as linhas que não apresentam erros de nenhum tipo?
  2. Existe uma maneira de suprimir as linhas específicas de saída?

Por favor, forneça uma abordagem geral para o problema, não apenas específico para esta questão.

    
por C0deDaedalus 13.02.2018 / 12:47

2 respostas

4

  1. Redirecionar o fluxo de erros padrão de ls para /dev/null :

    ls -R 2>/dev/null | grep '^chrom'
    
  2. Faça mais grepping:

    ls -R 2>/dev/null | grep '^chrom' | grep -v 'some additional pattern'
    

Você também pode considerar usar find ( Por que * not * pars 'ls'? ):

find . -name 'chrom*' ! -name 'some additional pattern' 2>/dev/null

Observe que find usa padrões de globalização de nomes de arquivos, enquanto grep usa expressões regulares. Com find você também pode procurar especificamente por arquivos (com -type f ) ou por diretórios ( -type d ) etc., por exemplo

find . -type f -name 'chrom*' ! -name 'some additional pattern' 2>/dev/null

Cada parte do comando find age como um "teste" contra o nome do caminho encontrado. -type testa o tipo de arquivo enquanto -name testa o componente final do nome do arquivo do caminho. Os testes são logicamente AND-ed juntos (a menos que -o seja usado). Um ponto de exclamação inverte o sentido de um teste.

    
por 13.02.2018 / 12:52
2

Melhor uso são as melhores suítes para esse tipo de tarefa:

Como usuário simples (porque você não tem permissão para ler arquivos como não-raiz):

$ find /var -type f -name 'chrom*' 2>/dev/null

Ou como root:

# find /var -type f -name 'chrom*'

E se você quiser filtrar um erro específico em , use:

command 2> >(grep -v 'specific error')

Aviso

Nunca analisar ls saída!

    
por 13.02.2018 / 12:52