Glob search (string output), finds all the pathnames matching a given pattern according to the rules used by the Unix shell.
@note Note Method not portable: works only on Unix/GNU Linux OS.
type(string) :: astring
type(string), allocatable :: alist_str(:)
integer, parameter :: Nf=5
character(14) :: files(1:Nf)
integer :: file_unit
integer :: f
integer :: ff
logical :: test_passed
do f=1, Nf
files(f) = astring%tempname(prefix='foo-')
open(newunit=file_unit, file=files(f))
write(file_unit, *)f
close(unit=file_unit)
enddo
call astring%glob(pattern='foo-*', list=alist_str)
do f=1, Nf
open(newunit=file_unit, file=files(f))
close(unit=file_unit, status='delete')
enddo
test_passed = .false.
outer_str: do f=1, size(alist_str, dim=1)
do ff=1, Nf
test_passed = alist_str(f) == files(ff)
if (test_passed) cycle outer_str
enddo
enddo outer_str
print '(L1)', test_passed
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(string), | intent(in) | :: | self |
The string. |
||
character(len=*), | intent(in) | :: | pattern |
Given pattern. |
||
type(string), | intent(out), | allocatable | :: | list(:) |
List of matching pathnames. |
subroutine glob_string(self, pattern, list) !< Glob search (string output), finds all the pathnames matching a given pattern according to the rules used by the Unix shell. !< !< @note Method not portable: works only on Unix/GNU Linux OS. !< !<```fortran !< type(string) :: astring !< type(string), allocatable :: alist_str(:) !< integer, parameter :: Nf=5 !< character(14) :: files(1:Nf) !< integer :: file_unit !< integer :: f !< integer :: ff !< logical :: test_passed !< !< do f=1, Nf !< files(f) = astring%tempname(prefix='foo-') !< open(newunit=file_unit, file=files(f)) !< write(file_unit, *)f !< close(unit=file_unit) !< enddo !< call astring%glob(pattern='foo-*', list=alist_str) !< do f=1, Nf !< open(newunit=file_unit, file=files(f)) !< close(unit=file_unit, status='delete') !< enddo !< test_passed = .false. !< outer_str: do f=1, size(alist_str, dim=1) !< do ff=1, Nf !< test_passed = alist_str(f) == files(ff) !< if (test_passed) cycle outer_str !< enddo !< enddo outer_str !< print '(L1)', test_passed !<``` !=> T <<< class(string), intent(in) :: self !< The string. character(*), intent(in) :: pattern !< Given pattern. type(string), allocatable, intent(out) :: list(:) !< List of matching pathnames. type(string) :: tempfile !< Safe temporary file. character(len=:), allocatable :: tempname !< Safe temporary name. integer(I4P) :: tempunit !< Unit of temporary file. tempname = self%tempname() call execute_command_line('ls -1 '//trim(adjustl(pattern))//' > '//tempname) call tempfile%read_file(file=tempname) call tempfile%split(sep=new_line('a'), tokens=list) open(newunit=tempunit, file=tempname) close(unit=tempunit, status='delete') endsubroutine glob_string