In your second command, you grep P*
. This will prompt the shell to do filename globbing on P*
, i.e. it will expand P*
to all files starting with the letter P
.
Use set -x
in your shell to see what gets executed (turn tracing off with set +x
). I actually have tracing turned on by default in my own interactive shell sessions just to see what I'm doing.
Just double-quoting P*
won't solve this as the regular expression P*
also matches filenames such as APPLE
and file.PP
, and actually hello_world.c
and all other filenames as well as P*
also matches filenames with no P
s in them.
Generally, you shouldn't parse the output of ls
though, so the following would be a better way of getting a list of files (not directories) starting with the letter P
:
$ find . -type f -maxdepth 1 -name "P*"
This will find all regular files (-type f
) in the current directory (.
) with names starting with P
(-name "P*"
). The -maxdepth 1
option restricts find
to only this directory. It would otherwise recurse down into subdirectories as well.
To do with find
what you're doing with grep -v /
, i.e. removing the directories from the list rather than selecting the regular files:
$ find . ! -type d -maxdepth 1 -name "P*"
This will also find non-regular files, such as sockets etc. In some shells it's necessary to escape or quote the !
, i.e. saying
$ find . "!" -type d -maxdepth 1 -name "P*"
or
$ find . \! -type d -maxdepth 1 -name "P*"
Note that the quoting of P*
is important so that your shell doesn't expand it.
Process...
? – JigglyNaga Jul 31 '16 at 10:42ls -p | grep -v / | grep P*
– asaf92 Jul 31 '16 at 10:44ls -p
. Congratulations, there must be a prize waiting for you somewhere. :) – Satō Katsura Jul 31 '16 at 11:04ls -p
for the purpose of filtering (in or out) directories is not uncommon (even though it's flawed in that it doesn't handle filenames with newline characters). – Stéphane Chazelas Jul 31 '16 at 11:14ls -p
from the link above, but i'll still have my prize please. – asaf92 Jul 31 '16 at 11:22Process1
,Process2
,Process3
, etc., as example *file names. This is almost as confusing as usingDirectory1
,Directory2
, andDirectory3
as example file names andFile1
,File2
, andFile3
as example directory names. More to the point, don’t say thatls
lists processes; that’s wrong. (2) Please don’t edit your question to say “I made a mistake.” Edit it to fix the mistake.* Add a comment if people have clearly been investing a lot of effort into the wrong version of the question, but don’t clutter up the question itself with change markings. – Scott - Слава Україні Jul 31 '16 at 16:23ls /etc | grep d*
is yielding no results butls /etc | grep p*
lists entire directory. – Scott - Слава Україні Jul 31 '16 at 16:39