In a directory, I have files like



How can I get a listing of only the first four files?

$ ls lazer_......
ls: lazer_......: No such file or directory

5 Answers 5


There are multiple methods:

ls only

ls lazer_??????

ls and egrep

ls | egrep '^lazer_.{6}$'


find . -regextype posix-egrep -regex '^./lazer_.{6}$'
  • Does ls only recognize * as a wildcard character?
    – Lazer
    Jan 8, 2011 at 17:53
  • also accepts ? and [ ]
    – wag
    Jan 8, 2011 at 17:59
  • 7
    It's not ls who expands wildcards: it's the shell who does.
    – alex
    Jan 8, 2011 at 18:14
  • 3
    @Lazer What you're experiencing is the difference between globbing and regular expressions. Unfortunately, these two grammars share some of the same symbols but they have very different meanings. In regex, the . means any single character but with globs, this is specified by ?. Shells understand globbing, not regex.
    – SiegeX
    Jan 8, 2011 at 21:45
  • 2
    In Bash, easy way to type ??????: <Esc> 6 ? or Alt-6 ?
    – ephemient
    Jan 8, 2011 at 22:43

With zsh you could use a glob like ?(#cN) (here the c flag requires the previous ? to match exactly N times):

setopt extendedglob
print -rl -- ?(#c12)

if you prefer ls:

ls -d -- ?(#c12)

You can also add qualifiers, e.g. search recursively for regular files with fixed name length:

print -rl -- **/?(#c12)(.)

With ksh93:

printf '%s\n' {12}(?)

for (non-hidden) files whose name are made of 12 characters.

Or if you prefer regular expressions:

printf '%s\n' ~(E)^.{12}$

As pointed out by SiegeX, Shell alone does not understand regular expressions. If you want a precise filter of your files, you must use regular expressions and hence use a command like egrep.

Here, the files you want to list begin with lazer_ and are followed only by some digits (possibly more or less that 6). I would do it this way:

ls | egrep '^lazer_[[:digit:]]*$'

This regex works the same as '^lazer_[0-9]*$'.

Regular expressions with egrep also handles repetition just like in the answer of wag, if you want to restrict your list to files ending with exactly 6 digits:

ls | egrep '^lazer_[[:digit:]]{6}$'

Another solution is to use echo command.

echo lazer_??????

Note that regular expression handling is done by whatever shell the echo command is running within.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.