処理する必要がある200個の衛星ファイルを含むフォルダがあります。プロセスには3つのステップがあり、Ubuntuでシェルスクリプトを使用してこれを処理したいと思います。 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%%.*}"