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.