파일 이름 일치 패턴

파일 이름 일치 패턴

처리해야 하는 200개의 위성 파일이 포함된 폴더가 있습니다. 프로세스에는 세 단계가 있으며 우분투에서 쉘 스크립트를 사용하여 이를 처리하고 싶습니다. for 루프를 사용하고 있습니다.

내 문제는 파일 이름입니다. 예는 A2013290123000.L1A_LAC.Ireland.hdf입니다.

변수를 만들 수 있습니다.

DATE=A2013
DATE1=`date +%j` #gives me the number of days since jan 1st 2013 in example above this would be 290
.L1A_LAC.Ireland.hdf part of the name doesn't change.

내 문제는 위의 예에서 이름의 중간 부분입니다: 123000

이름의 이 부분에는 패턴이 없습니다. 타임스탬프이지만 파일마다 다릅니다.

내 스크립트에 다음과 같은 변수를 만들고 싶습니다.

TIMESTAMP=$DATE$DATE1$DATE2

여기서 DATE2= 파일 이름의 중간 부분입니다.

이 변수를 다음과 같은 와일드카드로 지정할 수 있습니까?

DATE2=$*

변수의 값을 갖고 싶습니다.TIMESTAMP= A2013209123000

#!/bin/sh

#set -e

set -x #debug mode

<<comment
export OCSSWROOT=/home/seadas/seadas-7.0/ocssw
source $OCSSWROOT/OCSSW_bash.env
export PATH=$PATH:/home/seadas/seadas-7.0/bin
comment

DATE=A2013
DATE1=`date +%j`
DATE2=$*
TIMESTAMP=$DATE$DATE1$DATE2
LOCATION_NAME=Ireland

DATADIR=/home/MODIS
L2_DIR=/home/MODIS/L2
GEO_FILE_DIR=/home/MODIS/GEO
L1B_DIR=/home/MODIS/L1B
SCRIPTDIR=/home/seadas/seadas-7.0/ocssw/run/scripts
FILTERDIR=/home/seadas/seadas-7.0/ocssw/run/data/common
FUNCTION=/home/seadas/seadas-7.0/ocssw/run/bin/linux_64

HDFFILE=$TIMESTAMP.L1A_LAC.$LOCATIONNAME.hdf
GEOFILE=$LOCATION_NAME-$TIMESTAMP.GEO
LACFILE=$TIMESTAMP.L1B_LAC
HKMFILE=$TIMESTAMP.L1B_HKM
QKMFILE=$TIMESTAMP.L1B_QKM
L2FILE=$TIMESTAMP.L2.hdf


for i in `ls -r $DATADIR`

do
    echo "Start a Process for file $i";

'Generating geolocation file' $SCRIPTDIR/modis_GEO.py -d $DATADIR/$HDFFILE -o $GEO_FILE_DIR/$TIMESTAMP.GEO --threshold=95;

'Generating L1B file' $SCRIPTDIR/modis_L1B.py $DATADIR/$HDFFILE $GEO_FILE_DIR/$TIMESTAMP.GEO -o $L1B_DIR/$LACFILE -k $L1B_DIR/$HKMFILE -q $L1B_DIR/$QKMFILE;

'Generating L2 product'$FUNCTION/l2gen ifile=$L1B_DIR/$LACFILE geofile=$GEO_FILE/$TIMESTAMP.GEO par=$FILTERDIR/msl12_defaults.par ofile=$L2_DIR/$L2FILE resolution=-1 l2prod="default,sst,qual_sst,qual_sst4,sstref,sst4" filter_opt=0 proc_ocean=1 gas_opt=15;

echo "it $i is finished..." 

    echo "\n"
done

답변1

예상대로 작동하지 않습니다.

  • ls일반적으로 파일 이름에 특수 문자(예: 질문에 해당되지 않는 공백 등)가 있으면 실패하므로 결과를 반복하면 안 됩니다 .
  • 기존 HDF 파일을 반복하고 파일 이름에서 타임스탬프를 추출합니다.

    # assuming you do not have whitespaces etc. in filenames
    for i in $DATADIR/$DATE$DATE1*.L1A_LAC.$LOCATIONNAME.hdf ; do
      if [ ! -f "$i" ] ; then  #check if pattern could be expanded
           break ; 
      fi
      HDFFILE="$i"
      TIMESTAMP=$(basename "$i" ".L1A_LAC.$LOCATIONNAME.hdf")
      GEOFILE=$LOCATION_NAME-$TIMESTAMP.GEO
      LACFILE=$TIMESTAMP.L1B_LAC
      HKMFILE=$TIMESTAMP.L1B_HKM
      QKMFILE=$TIMESTAMP.L1B_QKM
      L2FILE=$TIMESTAMP.L2.hdf
    
      # process $i
      # [...]
    

답변2

내가 올바르게 이해했다면 타임스탬프를 얻으려면 파일 이름의 첫 번째 점 뒤의 모든 항목을 제거해야 합니다. 이것매개변수 확장도움이 될 것입니다:

TIMESTAMP="${i%%.*}"

관련 정보