Em seu segundo comando, você grep P* . Isso fará com que o shell faça globbing de nome de arquivo em P* , ou seja, ele expandirá P* para todos os arquivos que começam com a letra P .
Use set -x em seu shell para ver o que é executado (desativar o rastreio com set +x ). Eu realmente tenho o rastreamento ativado por padrão em minhas próprias sessões de shell interativas apenas para ver o que estou fazendo .
Apenas citar P* não resolverá isso, pois a expressão regular P* também corresponde a nomes de arquivos como APPLE e file.PP e, na verdade, hello_world.c e todos os outros nomes de arquivos, bem como P* , também correspondem a nomes de arquivos com não P s neles.
Geralmente, você não deve analisar a saída de ls , Portanto, o seguinte seria uma maneira melhor de obter uma lista de arquivos (não diretórios) começando com a letra P :
$ find . -type f -maxdepth 1 -name "P*"
Isso localizará todos os arquivos regulares ( -type f ) no diretório atual ( . ) com nomes começando com P ( -name "P*" ). A opção -maxdepth 1 restringe find apenas a este diretório. De outra forma, ele recursaria em subdiretórios também.
Para fazer com find o que você está fazendo com grep -v / , ou seja, removendo os diretórios da lista, em vez de selecionar os arquivos regulares:
$ find . ! -type d -maxdepth 1 -name "P*"
Isso também encontrará arquivos não regulares, como soquetes, etc. Em alguns shells, é necessário escapar ou citar o ! , ou seja, dizendo
$ find . "!" -type d -maxdepth 1 -name "P*"
ou
$ find . \! -type d -maxdepth 1 -name "P*"
Note que a citação de P* é importante para que seu shell não o expanda.