Existe alguma opção / comando para diferenciar arquivos com base no status de cópia do arquivo no diretório?

1

Eu tenho o código abaixo, que verifica se o arquivo no diretório está no status de cópia / carregamento de outro aplicativo em um diretório.

Código:

for file in PATH/*
do

    lsofresult='lsof | grep $file | wc -l'
    while [ $lsofresult != 0 ]; do 
        echo "still copying file $file..."
        sleep 1
        lsofresult='lsof | grep $file | wc -l'
    done
done

O código de retorno do loop será usado para a lógica adicional. Mas, se os arquivos continuarem entrando no diretório, esse loop continuará sendo executado. Mas eu quero trabalhar nos arquivos que são concluídos copiando para o diretório de outro aplicativo.

Assim, o cenário ideal é se dois arquivos estiverem sendo copiados para o diretório no qual um arquivo foi concluído, quero trabalhar no arquivo concluído assim que a cópia for concluída e o outro arquivo que estará no estado de cópia precisa trabalhar após a conclusão. Existe alguma opção para diferenciar os arquivos copiados e copiados em um diretório? Em caso afirmativo, alguém pode ajudar com isso?

    
por unixlearner 24.08.2017 / 14:21

1 resposta

1

Você tem um erro lógico em seu pensamento, se eu entendi que você está correto. Você está tentando verificar se um arquivo terminou de copiar enquanto outro arquivo ainda está sendo copiado. Por enquanto, tudo bem.

MAS eu acho que você está usando algo parecido com o seu for PATH/* - talvez cp path/* destination/* ? -, o que faria o comando copiar um arquivo após o outro, mas ao mesmo tempo você deseja verificar em segundo plano todos os arquivos simultaneamente se houver um comando cp em execução e se não quiser fazer algo mais com eles. Como você se certificaria de que seu cp já havia copiado seu arquivo e não apenas não estava lá ainda? Não funciona com o seu psof, pelo menos não se você quiser verificá-los ao mesmo tempo.

O que você realmente precisa fazer é verificar se o arquivo já existe no destino e tem a mesma soma do arquivo original, só então você pode ter certeza de que seu arquivo foi copiado com sucesso.

Isso deve lhe dar uma ideia melhor sobre o que procurar e por que seu script não funcionará da maneira que você deseja no momento.

Infelizmente, isso foi um pouco longo para um comentário.

Na verdade, sentei-me e criei um script que você provavelmente pode usar para o que descreveu. Não tenho certeza se ele está otimizado, mas pelo menos as verificações são executadas ao mesmo tempo em que a cópia está em andamento e continua fazendo algo após a conclusão da cópia:

#! /bin/bash
SOURCEPATH="/path/to/sourcefiles"
DESTINATION="/path/to/destination"
FILES='find $SOURCEPATH -type f'

function copy {

cp $SOURCEPATH/* $DESTINATION

}

function nextfunction {
#Could also do something else with the file already
echo "Done copying" $1
}


function check {
#Output so we see that the checks run simultaniously
echo "original path variable:" $1
echo "filename:" ${1##*/}

hashOfInputFile='md5sum $1 | cut -d" " -f1'

#make sure the file actually exists before trying to create a hashsum
while [ ! -f $DESTINATION/${1##*/} ]; do 
sleep 5
done

#create a first hashsum to check if the file is completly copied
hashOfCopiedFile='md5sum $DESTINATION/${1##*/} | cut -d" " -f1'

#check if the hashsums are the same if not wait a little and create a new one
while [ "$hashOfInputFile" != "$hashOfCopiedFile" ]; do
sleep 5
hashOfCopiedFile='md5sum $DESTINATION/${1##*/} | cut -d" " -f1'
done

#proceed to do something else with the source file 
nextfunction $1
}

#put the copy in the background so we can proceed with the script
copy &

for file in $FILES 
do
#checks are also put in the background so the script continues
check $file &
done
    
por 24.08.2017 / 17:13