Como grep stderr? [duplicado]

0

Como faço para grep este comando que inclui um curinga?

Como faço para grep stderr ?

O grep parece não fazer nada:

$ less /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/* | grep "Not a file"
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/truffle is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/wunderline is a directory
/Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/yo is a directory

Este é um uso muito hacky de menos, e provavelmente digno de outra pergunta, mas minha intenção é encontrar links simbólicos quebrados neste diretório. Acontece que menos imprimirá is a directory se for válido e Not a file or directory se for inválido. Eu acredito que vale a pena perguntar de qualquer maneira, pois isso é indicativo da minha falta de compreensão do stderr dos operadores curinga .

    
por Raine 29.06.2016 / 18:50

2 respostas

2

O curinga não tem nada a ver com grep , tudo o que grep vê é o que é canalizado para ele. O curinga é expandido pelo shell e a lista de arquivos para os quais ele é expandido é passada para less . Portanto, o problema não tem nada a ver com grep .

Dito isto, se você está procurando por links quebrados, você pode fazer:

for f in /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/*; do
     [ -e $(readlink -f "$f") ] || echo "$f"; 
done

Isso iterará todos os arquivos e diretórios em /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ , verifique se o destino deles existe ( readlink imprimirá o nome do arquivo em que foi executado se o arquivo não for um link) e imprima o nome se ele não for t.

Uma solução muito melhor que eu aprendi sobre é:

find /Users/raine/.nvm/versions/node/v5.5.0/lib/node_modules/ -xtype l 

O -xtype testará se o destino do link é, nesse caso, um link, portanto, isso só será verdadeiro para links pendentes.

    
por 29.06.2016 / 19:16
1

Como o @SatoKatsura apontou em seu comentário, o uso (hacky) de less está saindo para stderr , enquanto o grep lê de stdout . Embora seja uma solução ruim para a tarefa real de encontrar links simbólicos mortos, ele pode funcionar redirecionando stderr para stdout :

less ~/.nvm/versions/node/v5.5.0/lib/node_modules/* 2>&1 | grep "Not a file"
    
por 29.06.2016 / 19:24