regexbashshellunix

how to loop through files that match a regular expression in a unix shell script


I want to be able to loop through a list of files that match a particular pattern. I can get unix to list these files using ls and egrep with a regular expression, but I cannot find a way to turn this into an iterative process. I suspect that using ls is not the answer. Any help would be gratefully received.

My current ls command looks as follows:

ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat'

I would expect the above to match:

but not:

Thanks,

Paul.


Solution

  • You can use (GNU) find with the regex search option instead of parsing ls.

    find . -regextype "egrep" \
           -iregex '.*/MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' \
           -exec [[whatever you want to do]] {} \;
    

    Where [[whatever you want to do]] is the command you want to perform on the names of the files.

    From the man page

    -regextype type
              Changes  the regular expression syntax understood by -regex and -iregex tests 
              which occur later on the command line.  Currently-implemented types are 
              emacs (this is the default),posix-awk, posix-basic, posix-egrep and 
              posix-extended.
    
      -regex pattern
              File name matches regular expression pattern.  This is a match on the whole 
              path, not a search.  For example, to match a file named `./fubar3', you can 
              use the regular expression
              `.*bar.' or `.*b.*3', but not `f.*r3'.  The regular expressions understood by 
              find are by default Emacs Regular Expressions, but this can be changed with 
              the -regextype option.
    
      -iregex pattern
              Like -regex, but the match is case insensitive.