名前に日付を含むファイルが毎日表示される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