我有一个如下脚本,根据文件编号基于文件的存在将文件从源目录复制到目标目录
#! /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
请帮帮我。感谢
答案 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