如何等待所有文件并将其复制到目录中

如何等待所有文件并将其复制到目录中

我有 3 个文件,每天都会出现,文件名中带有日期。我需要检查所有 3 个文件的日期是否与今天的日期匹配。并且需要等待3个文件,因为所有文件可能不会同时到达。如果所有文件都到达,则只需将所有 3 个文件复制到目标目录。

下面的示例代码适用于所有文件(如果有)。但我需要制作一些 while 循环或某些 sleep 命令,其中我的脚本可以等待/查找 src 目录中的所有 3 个文件,然后将所有文件一起移动。

#!/bin/ksh
src_dir=/data/SIN/src;
tgt_dir=/data/SIN/tmp;
cd $src_dir;
RUN_DATE=`date +%Y%m%d`;

file1=file1_${RUN_DATE}.txt
file2=file2_${RUN_DATE}.txt
file3=file3_${RUN_DATE}.txt

file_count=`ls -lrt ${src_dir}/*.txt | grep $RUN_DATE | wc -l` ;

if [ "$file_count" == 3 ]
then
        echo "all 3 files are available";
        cp ${src_dir}/${file1} $tgt_dir;
        cp ${src_dir}/${file2} $tgt_dir;
        cp ${src_dir}/${file3} $tgt_dir;
    echo "files copied";
else
        echo "file missing";
fi

答案1

尝试

file_count=$(ls -lrt ${src_dir}/*.txt | grep -c $RUN_DATE)

while [ "$file_count" != 3 ]
do
    echo "file missing";
    sleep 60
    file_count=$(ls -lrt ${src_dir}/*.txt | grep -c $RUN_DATE)
else
        echo "all 3 files are available";
        cp ${src_dir}/${file1} $tgt_dir;
        cp ${src_dir}/${file2} $tgt_dir;
        cp ${src_dir}/${file3} $tgt_dir;
    echo "files copied";
    return

done

注意

  • 解析 ls 的输出是一个坏主意,除非你确定你没有任何有趣的字符(空格,新行......)
  • 我替换grep | wc -lgrep -c它做同样的事情
  • 以同样的方式我将反引号替换为$( )

编辑:缺少哪个文件?

代替

echo "file missing";

经过

test -f ${src_dir}/${file1} || echo ${file1} missing
test -f ${src_dir}/${file2} || echo ${file2} missing
test -f ${src_dir}/${file3} || echo ${file3} missing

答案2

你已经很接近了,只需if用循环切换你的语句while,或者只是按照你的建议添加一个 while 循环就可以解决你的问题。

#!/bin/ksh
src_dir=/data/SIN/src;
tgt_dir=/data/SIN/tmp;
cd $src_dir;
RUN_DATE=`date +%Y%m%d`;

file1=file1_${RUN_DATE}.txt
file2=file2_${RUN_DATE}.txt
file3=file3_${RUN_DATE}.txt

file_count=`ls -lrt ${src_dir}/*.txt | grep $RUN_DATE | wc -l` ;

# check every 5 seconds if the files are all there
while [ "$file_count" -ne 3 ]; do
    sleep 5
    file_count=`ls -lrt ${src_dir}/*.txt | grep $RUN_DATE | wc -l`
done

if [ "$file_count" == 3 ]
then
    echo "all 3 files are available";
    cp ${src_dir}/${file1} $tgt_dir;
    cp ${src_dir}/${file2} $tgt_dir;
    cp ${src_dir}/${file3} $tgt_dir;
    echo "files copied";
else
    echo "file missing";
fi

这可以工作,但如果该目录中有超过 3 个文件,或者其中一个或多个文件从未出现,它就会挂起。所以我建议在 while 循环中添加一个中断:

# check every 5 seconds if the files are all there, up to 10 times
count=0
while [ "$file_count" -ne 3 ]; do
    sleep 5
    file_count=`ls -lrt ${src_dir}/*.txt | grep $RUN_DATE | wc -l`
    found_files=$(ls -lrt ${src_dir}/*.txt | grep $RUN_DATE)
    echo -e "files found:\n\t$found_files" # print the files that have been found so you know which are missing
    ((count++))
    if [ "$count" = 10 ]; then
        break
    fi
done

相关内容