Uma expressão regular não é uma glob.
Eu estou supondo que você quer arquivos que começam com "d". Nesse caso, você precisa:
ls /etc | sort | grep '^d'
O que deu errado
Como a seguinte declaração se comporta depende dos arquivos no diretório atual:
ls /etc | sort | grep p*
Como está sem aspas, o shell tentará expandir o glob p*
, substituindo-o pelos nomes de arquivos do diretório atual .
Se nenhum nome de arquivo corresponder, então um literal p*
será passado para grep
. Como grep
espera expressões regulares, ele interpreta p*
para significar zero ou mais ocorrências da letra p
. Como tudo tem um p
ou não, que corresponde a tudo .
Por que grep d*
não lista nada?
Isso provavelmente significa que havia um nome de arquivo começando com d
no diretório atual. Só para ser específico, digamos que o nome do arquivo seja dichotomy
. O shell expande d*
para dichotomy
e passa isso como o argumento para grep
. Assim, o comando efetivo é:
grep dichotomy
É provável que não tenha havido resultados quando você executou grep d*
.
O que acontece se vários arquivos corresponderem ao d*
glob?
Considere o comando:
grep d*
Se houver vários arquivos correspondentes a esse glob, diga dmesg
daemon.log
e dpkg.log
. O shell expandiria d*
para a lista desses arquivos em ordem alfabética (que depende da sua localidade). Isso pode resultar em:
grep daemon.log dmesg dpkg.log
Este comando procura a presença da string daemon.log
nos arquivos dmesg
e dpkg.log
. Se essa sequência não ocorrer nesses arquivos, não haverá resultados de saída.