Como esperar por todos os arquivos e copie para dir

0

Eu tenho 3 arquivos que virão todos os dias com data no nome do arquivo. Eu preciso verificar todos os 3 arquivos data se coincidindo com a data de hoje. e precisa esperar por 3 arquivos, porque todos os arquivos podem não vir ao mesmo tempo. se todos os arquivos chegarem, será necessário copiar todos os 3 arquivos para o diretório de destino.

abaixo do código de amostra está funcionando para todos os arquivos, se disponível. mas eu preciso fazer algum loop while ou algo como sleep command onde meu script pode esperar / procurar por todos os 3 arquivos no diretório src e depois mover todos juntos.

#!/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
    
por goldenbutter 31.08.2018 / 11:13

2 respostas

0

Você está tão perto, apenas alterando sua instrução if com um loop while , ou apenas adicionando um loop while, como você sugere, deve fazer o truque para você.

#!/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

Isso funcionaria, embora fosse interrompido caso houvesse mais de três arquivos nesse diretório, ou se um ou mais arquivos nunca aparecessem. Então, eu recomendo adicionar uma pausa ao loop 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
    
por 31.08.2018 / 11:25
1

tente

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

observe que

  • é uma má idéia analisar a saída de ls, a menos que você tenha certeza de que não possui nenhum caractere engraçado (espaço, nova linha ...)
  • eu substituí grep | wc -l por grep -c que fazem o mesmo
  • Da mesma forma, recoloquei a citação em $( )

Editar: qual arquivo está faltando?

substituir

echo "file missing";

por

test -f ${src_dir}/${file1} || echo ${file1} missing
test -f ${src_dir}/${file2} || echo ${file2} missing
test -f ${src_dir}/${file3} || echo ${file3} missing
    
por 31.08.2018 / 11:26