(Nota: rsync --remove-source-files
é o comando que eu estava procurando, exceto que ele não verifica dados.)
Em relação à comparação binária, descobri que diff
pode fazer isso:
No diretório de origem:
for f in *.jpg; do diff $f "/path/to/destination/$f"; done
Isso compara arquivos binários na origem e no destino. Nenhuma saída = os arquivos não diferem.
Isso pode ser usado para verificar dados.
Como diff
retorna 0
no caso em que nenhuma diferença foi encontrada, pode-se fazer
for f in *.jpg; do diff $f "/desination/$f" && rm $f; done
Isso removerá o arquivo $f
na pasta de origem se diff
retornar 0
, isto é; os arquivos são binários iguais.
Pode ser útil fazer com que isso pareça um novo comando, vamos chamá-lo de verify-rm
.
Como tenho o Dropbox instalado, colocarei meus scripts na minha pasta do Dropbox para não ter que me preocupar em fazer o backup deles quando eu reinstalar o sistema operacional dentro de 6 meses ...
$ cd ~/Dropbox && mkdir my-scripts && cd my-scripts
$ vim verify-rm
Aqui está o meu script verify-rm
:
if [ "$#" -lt 2 ];
then
echo "Bad arguments, use like cp command"
else
success=0
fail=0
error=0
for arg in ${@:1:$(($#-1))}
do
#echo "$arg ${@:(-1):1}"
diff "$arg" "${@:(-1):1}"
ret=$?
if [ $ret -eq 0 ]
then
success=$((success+1))
echo "Verified file $arg"
rm $arg
elif [ $ret -eq 1 ]
then
fail=$((fail+1))
echo "Binary files $arg and ${@:(-1):1} differ"
else
error=$((error+1))
echo "diff exited with error: code=$ret"
fi
done
echo "Summary: $success files verified and ok"
echo " $fail files differ!"
echo " $error errors"
echo "Files which differ not removed"
echo "Files where diff returned error code not removed"
fi
Torne o script executável
$ chmod +x verify-rm
Em seguida, use o novo script ("comando")
$ verify-rm /path/to/source/*.jpg /path/to/destination
Tenho notado que os arquivos com espaços no nome do arquivo não são processados corretamente, pois o bash trata cada conjunto de caracteres entre espaços como um argumento diferente. Não tenho certeza do que fazer sobre isso, ou se isso pode ser corrigido.
No entanto, tem sido apontado nos comentários que rsync --remove-source-files
também funcionará, e rsync
funciona corretamente quando há espaços nos nomes dos arquivos, e eu notei que é muito mais rápido também, então eu recomendo apenas usar rsync
.