0

我有一个脚本如下,它根据文件的存在性将文件从源目录复制到目标目录


#! /bin/ksh

export SRCDIR=/informat/PowerCenter/9.1.0/server/infa_shared/SrcFiles/CSI/historical

export BINDIR=/informat/PowerCenter/9.1.0/server/infa_shared/Bin

export TGTDIR=/informat/PowerCenter/9.1.0/server/infa_shared/SrcFiles/CSI/incoming


export LASTRUNDT=`cat /informat/PowerCenter/9.1.0/server/infa_shared/ParameterFiles/CSI_CONFIRMIT_RESPONSE.param | grep '\$\$LASTRUNDATE=' | sed 's/\$\$LASTRUNDATE=//g'`

export FILEDT=`date -d "$LASTRUNDT +1day" +%-m_%-d_%Y`


for FILE_NUM in {11259,11318,11366,11367,11368,11369,11370,11372,11373,11374,11385,11386,11387,11388,11389,11390,11398};do

  export GET_FNAMES=AllResponses_${FILE_NUM}_${FILEDT}*.txt

         GET_FNAME=`ls -1 ${GET_FNAMES}`
         if [ -f ${GET_FNAME} ]; then
         cp ${SRCDIR}/${GET_FNAME} ${TGTDIR}
        fi
done

但是在使用上面的脚本进行上面的文件复制时,我不想复制文件编号存在于下面的文件中的文件。

CSI_CONFIRMIT_RESPONSE_SWITCHOFF.cfg

11369

11370

11372

请帮我。谢谢

4

1 回答 1

1

最简单的方法是grep检查文件中是否存在文件号,如果不存在则仅执行复制:

for FILE_NUM in 11259 11318 11366 11367 11368 11369 11370 11372 11373 11374 11385 11386 11387 11388 11389 11390 11398; do
    if ! grep -qFxw "$FILE_NUM" CSI_CONFIRMIT_RESPONSE_SWITCHOFF.cfg
    then
        # copy code here
    fi
done

但是,这效率不高,因为您正在grep为每个数字运行。

一种更有效的方法是使用comm一次将您的号码列表与文件进行比较,以找出文件中不存在的号码。如下所示:

file_nums=(11259 11318 11366 11367 11368 11369 11370 11372 11373 11374 11385 11386 11387 11388 11389 11390 11398)
comm -23 <(printf -- '%s\n' "${file_nums[@]}" | sort) <(sort CSI_CONFIRMIT_RESPONSE_SWITCHOFF.cfg) | while IFS= read -r FILE_NUM
do
    # copy code here
done
于 2013-10-25T09:42:34.890 回答