Meu problema (em um script com #!/bin/sh
) é o seguinte: Eu tento verificar todos os arquivos em um diretório para fins de arquivamento. O arquivo de soma de verificação (no meu caso, sha1) com todos os nomes de arquivos deve residir no mesmo diretório. Vamos dizer que temos um diretório ~/test
com arquivos f1
e f2
:.
mkdir ~/test
cd ~/test
echo "hello" > f1
echo "world" > f2
Agora calculando as somas de verificação com
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum
faz exatamente o que eu quero, lista todos os arquivos do diretório atual e calcula as somas sha1 (a profundidade máxima pode ser alterada posteriormente). A saída no STDOUT é:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
Infelizmente, ao tentar salvá-lo em um arquivo com
find -maxdepth 1 -type f -printf '%P\n' | xargs shasum > sums.sha1
o arquivo resultante exibe a soma de verificação para si mesmo:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
e, portanto, falha em um posterior shasum --check
, devido ao problema óbvio de modificação de arquivo adicional ao salvar a última soma.
Eu olhei em volta e usando -p
flag para xargs
, descobri que de alguma forma cria o arquivo de saída antes mesmo de executar o comando find, portanto o arquivo adicional é encontrado e será verificado ...
Eu sei que, como uma solução alternativa, eu poderia salvar a soma de verificação em outro local (diretório temporário via mktemp
) ou excluí-la especificamente, mas gostaria de entender por que ela se comporta da maneira como funciona. meus olhos não são tão úteis, por exemplo, se o primeiro comando verificar se o arquivo de saída já está no disco, ele nunca obterá a resposta correta ...