In this case GNU find
lets you do all these things in one go, eliminating pipes and potentially troublesome parsing of ls
:
find . -maxdepth 1 -name '[^.]*' \
-regextype posix-extended -regex "MYPATTERN" \
-printf 'SOMEPREFIX %f SOMESUFFIX\n'
(find
is not a good way to arbitrarily modify the output of other commands, of course!)
Some notes:
-maxdepth 1
and -name [^.]*
make name matching work the same as a plain ls
(or ls .
). You can use any shell-style glob, but note that "*" will match a leading "." in a name† unlike bash
, so [^.]*
means anything that doesn't have a leading "."
- MYPATTERN is a proper POSIX ERE (default type is Emacs, see here), but it must match the entire filename (including the
./
prefix) so use something like .*thing.*
instead of just thing
- you can probably just use one of
-name
/-regex
instead of both (e.g. -regex "[^.].MYPATTERN."
-printf
supports lots of things, %n
is the unadorned file or directory name
- beware
find
(contrary to ls
) doesn't sort the list of file names.
- it assumes the file names constitute valid text in the current locale.
† (this can depend on your version of find
though, check the "STANDARDS CONFORMANCE" section of your man page)
As a possible alternative with no external programs required, bash
has compgen
which, among other things, expands globs, equivalent to an ls
with no options:
compgen -P "someprefix>" -S "<somesuffix" -G "pattern"
This handles filenames with whitespace, including newlines. compgen -G "*"
should provide the same output as a plain ls
(but note that ls *
is a different thing entirely). You'll still need grep
, and this may or may not solve the problem, but it's worth a mention.
ls
- it's bad juju. Also, does it have to begrep
? And can you give some example output?