如何在Unix中控制基于另一个文件复制文件?

时间:2013-10-25 09:15:30

标签: unix

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


#! /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

请帮帮我。感谢

1 个答案:

答案 0 :(得分: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