Reputation: 633
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.
Upvotes: 16
Views: 23209
Reputation: 569
I was looking for listing sda*
and sdb*
ending with one digit in /dev
and I found that ls works by itself in this case:
> /dev/sd[ab][0-9]
/dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 /dev/sda6 /dev/sdb1
But there is a limitation that is it does not like the +
character, if I want to search for example with several digit at end:
> ls /dev/sd[ab][0-9]+
ls: cannot access /dev/sd[ab][0-9]+: No such file or directory
And here you'll indeed need to use ls | egrep ...
or find
as other mentioned, but since in your regex you don't have a +
, this should work for you:
ls MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat
Upvotes: 0
Reputation: 633
Based on the link Andy K provided I have used the following to loop based on my matching criteria:
for i in $(ls | egrep -i 'MYFILE[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01]).dat' ); do
echo item: $i;
done
Upvotes: 9
Reputation: 11216
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.
Upvotes: 10