pattern matching while using ls command in bash script

10,179

Solution 1

If you're using sh and not bash, and presumably you also want to be POSIX compliant, you can use:

for f in ./*
do
    echo "$f" | grep -Eq '^\./abc.[0-9]+$' && continue
    echo "Something with $f here"
done

It will work fine with filenames with spaces, quotes and such, but may match some filenames with line feeds in them that it shouldn't.

If you tagged your question bash because you're using bash, then just use extglob like you described.

Solution 2

if I understood you right, the pattern could be translated into regex:

^abc\.[0-9]+$

so you could

keep using ls and grep the output. for example:

ls *.*|xargs -n1|grep -E '^abc\.[0-9]+$'

or use find

find has an option -regex

Share:
10,179
keeda
Author by

keeda

Updated on June 04, 2022

Comments

  • keeda
    keeda almost 2 years

    In a sh script, I am trying to loop over all files that match the following pattern
    abc.123 basically abc. followed by only numbers, number following . can be of any length.
    Using

    $ shopt -s extglob
    $ ls abc.+([0-9])

    does the job but on terminal and not through the script. How can I get only files that match the pattern?