Meu problema (em um script com #!/bin/sh
) é o seguinte: Tento somar 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 apenas todos os arquivos do diretório atual e calcula as somas sha1 (a profundidade máxima pode ser alterada posteriormente). A saída em STDOUT é:
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
Infelizmente, ao tentar salvar isso 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:
da39a3ee5e6b4b0d3255bfef95601890afd80709 sums.sha1
f572d396fae9206628714fb2ce00f72e94f2258f f1
9591818c07e900db7e1e0bc4b884c945e6a61b24 f2
e, portanto, falha posteriormente shasum --check
, devido ao problema óbvio de modificação de arquivo adicional ao salvar a última soma.
Olhei em volta e, usando o -p
sinalizador 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á soma de verificação ...
Sei que, como solução alternativa, eu poderia salvar a soma de verificação em outro local (diretório temporário via mktemp
) ou excluí-la na localização específica, mas gostaria de entender por que ela se comporta da maneira que faz - o que, a meu ver, não é tão útil, por exemplo, se o primeiro comando verificar se o arquivo de saída já está no disco, ele nunca obterá a resposta correta ...
sh
chamadas forem necessárias. Observe que você precisa de um argumento para $0
antes {}
.
tee
desapareceu? Eu tentei e funciona bem, eu também suprimi STDOUT com adição de 1>/dev/null
. Havia algo errado com a resposta ou foi um bug?
xargs
, é o próprio shell que cria esse arquivo, porque antes que qualquer comando seja executado, o shell redireciona todas as entradas, saídas e pipes, de modo que, quandofind
iniciado, o arquivo de saída já existe. Em-exec
vez disso, use :find -maxdepth 1 -type f -exec sh -c 'shasum "$@" > sums.sha1' {} +