How can I search for a file with fixed name length using ls?

11,653

Solution 1

There are multiple methods:

ls only

ls lazer_??????

ls and egrep

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

find

find . -regextype posix-egrep -regex '^./lazer_.{6}$'

Solution 2

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)(.)

Solution 3

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}$

Solution 4

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}$'
Share:
11,653

Related videos on Youtube

Lazer
Author by

Lazer

Updated on September 17, 2022

Comments

  • Lazer
    Lazer almost 2 years

    In a directory, I have files like

    lazer_100506
    lazer_100707
    lazer_091211
    lazer_110103
    lazer_100406_temp
    lazer_100622#delete
    

    etc

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

    $ ls lazer_......
    ls: lazer_......: No such file or directory
    $ 
    
  • Lazer
    Lazer over 13 years
    Does ls only recognize * as a wildcard character?
  • wag
    wag over 13 years
    also accepts ? and [ ]
  • alex
    alex over 13 years
    It's not ls who expands wildcards: it's the shell who does.
  • SiegeX
    SiegeX over 13 years
    @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.
  • Mathieu Chapelle
    Mathieu Chapelle over 13 years
    Note that [:digit:] is a POSIX character class.
  • Prabhjot Singh
    Prabhjot Singh about 3 years
    The command given in this answer is already described in the other answer.