모든 파일을 기다렸다가 디렉토리에 복사하는 방법

모든 파일을 기다렸다가 디렉토리에 복사하는 방법

이름에 날짜가 포함된 파일이 매일 표시되는 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개 이상의 파일이 있거나 하나 이상의 파일이 나타나지 않으면 작동이 중단됩니다. 따라서 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

관련 정보