How can I search for a file with fixed name length using ls?
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}$'
Related videos on Youtube
Lazer
Updated on September 17, 2022Comments
-
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 over 13 yearsDoes
ls
only recognize*
as a wildcard character? -
wag over 13 yearsalso accepts
?
and[ ]
-
alex over 13 yearsIt's not
ls
who expands wildcards: it's the shell who does. -
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 over 13 yearsNote that
[:digit:]
is a POSIX character class. -
Prabhjot Singh about 3 yearsThe command given in this answer is already described in the other answer.