Verifique se um arquivo ou pasta já foi corrigido

17

É possível saber se um arquivo já foi corrigido, antes de aplicar o patch?

Eu preciso fazer isso em um roteiro, algum pensamento?

    
por daisy 15.11.2012 / 03:25

4 respostas

15

Sim, apenas execute patch com --dry-run opção, ele falhará ou será bem-sucedido, o que pode ser descoberto com seu status de saída.

Mas no modo mais comum (e propenso a erros) , você provavelmente terá que executá-lo com a opção -R , o que significa "reverso", pois somente se ele foi capaz de reverter todo o patch ser considerado como "aplicado". Caso contrário (sem '-R') poderia falhar apenas devido a algumas partes do arquivo original foi alterado. Abaixo está um exemplo simples:

if ! patch -R -p0 -s -f --dry-run <patchfile; then
  patch -p0 <patchfile
fi

(Ainda mais, no snippet acima você pode até preferir silenciar patch redirecionando completamente seu stdout e stderr para /dev/null )

    
por 15.08.2013 / 16:01
13

Apenas no caso de ajudar alguém, se você estiver usando o script bash, o exemplo dado pelo Omnifarious não funcionará. No bash, o status de saída de um comando bem-sucedido é 0

Então, o seguinte funcionaria:

patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status 
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
    #apply the patch
    patch -p0 -N < patchfile
fi
    
por 31.05.2013 / 09:52
2

Aqui está uma suposição, supondo que você esteja usando o utilitário patch e cada arquivo a ser corrigido tenha seu próprio patch:

if nohup patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
    echo The file has not had the patch applied,
    echo and the patch will apply cleanly.
else
    echo The file may not have had the patch applied.
    echo Or maybe the patch doesn't apply to the file.
fi
    
por 15.11.2012 / 05:25
0

No meu caso, eu queria fazer essa verificação para que a execução do comando patch não terminasse com um terminal interativo perguntando o que fazer (especialmente para o IC).

Acontece que se você só precisa disso, você também pode usar o argumento --forward e ele irá pular o patch se já estiver aplicado!

    
por 24.10.2018 / 13:19

Tags