列出循环索引指定的目录的内容

时间:2016-10-18 20:19:09

标签: shell fortran

我正在使用数字天气预报命名如下:

sub_gfsanl_4_2011MMDD-IIII-FFFF.grb2

-MM表示从01到12的月份

-DD表示从01到31的天数

-IIII代表初始化时间,第一个和第二个数字代表小时数,第三个和最后一个代表分钟

-FFFF代表预测小时,第一位和第二位是小时第三位,最后一位是分钟

在我的目录中,我在给定月份的给定日期内有几个文件。一天有4个数据,每六个小时一个,IIII = 0000,0600,1200,1800。

我要做的是列出给定日期的所有文件,这里是我写的f90代码:

program test_ec

implicit none

!==variable declaration==

integer :: mi,di,dil,mil
character*3 :: temp

!==Program instructions==

mil=1
write(temp,'(i2.2)') mil
read(temp,'(i2.2)') mi
!convert the month into a two digit value mi=01  


 ! change to directory where the data are stored
 CALL chdir('/media/Hello/ncfiles/GFS' )

do dil=1,31

     !loop over days
     write(temp,'(i2.2)') dil
     read(temp,'(i2.2)') di

     ! converting day number into a two digit number, store this value into di. ex dil=9 then di=09

CALL execute_command_line( 'ls sub_gfsanl_4_2011${mi}${di}*.nc > yes.txt' )
!list all files with the correct month and days and store it to yes.txt

end do

end program test_ec

由于某些原因,execute_command_line似乎不喜欢$ for变量...

2 个答案:

答案 0 :(得分:0)

您无法在shell中使用${mi}${di}。它们是Fortran变量,而不是shell变量。您必须将数字放入Fortran内的字符串中。使用一些既定方法。他们在Convert integers to strings to create output filenames at run time及其副本中被多次处理(参见右侧的相关内容)。

答案 1 :(得分:0)

非常感谢弗拉基米尔在这里建议我为解决问题所做的一切!

program test_ec


implicit none

integer :: mi,di,iiii,fff
 character(len=1024) :: filename
 character(len=1024) :: format_string
 logical exist

mi=1
CALL chdir('/media/Hello/ncfiles/GFS' )

!do di=1,10
     do iiii=0,18,6
         do fff=0,18,6

                   format_string = "(A17,i2.2,i2.2,A1,i4.4,A1,i3.3,A8)"
                    write (filename,format_string) "sub_gfsanl_4_2011",mi,di,"_",iiii,"_",fff,".grb2.nc"

                    inquire(file=trim(filename), exist=exist) 

                           if (exist) then

                                   write(*,*) 'file exists i can do do whatever i want with this file'
                           else
                                   write(*,*) 'I did not find that file.'

                           end if
enddo
   enddo
     enddo

end program test_ec