すべてのファイルを待ってからディレクトリにコピーする方法

すべてのファイルを待ってからディレクトリにコピーする方法

名前に日付を含むファイルが毎日表示される3つのファイルがあります。 3つのファイルの日付がすべて今日の日付と一致することを確認する必要があります。そして、すべてのファイルが同時に到着しない可能性があるため、3つのファイルを待つ必要があります。すべてのファイルが到着したら、3つのファイルをすべてターゲットディレクトリにコピーします。

以下のサンプルコードは、すべてのファイル(存在する場合)で機能します。ただし、スクリプトがsrcディレクトリ内の3つのファイルをすべて待機または検索し、すべてのファイルを一緒に移動できる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` ;

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 -lそれを交換しましたgrep -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つ以上のファイルがある場合、または1つ以上のファイルが表示されない場合、操作は中断されます。したがって、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

関連情報