Aqui está um script bash / ksh93 / zsh que emula o comportamento principal do rsync, onde você pode facilmente ajustar a decisão de copiar ou não copiar um arquivo de origem. Aqui, uma cópia é feita apenas se o arquivo de origem for maior e mais novo. No bash, adicione shopt -s globdots
antes do script. Não testado.
target=/path/to/destination
cd source-directory
skip=
err=0
for x in **/*; do
# Skip the contents of a directory that has been copied wholesale
case $x in $skip/*) continue;; *) skip=;; esac
if [[ -d $x ]]; then
# Recreate source directory on the target.
# Note that existing directories do not have their permissions or modification times updated.
if [[ -e $target/$x ]]; then continue; fi
skip=$x
if [[ -e $target/$x ]]; then
echo 1>&2 "Not overwriting non-directory $target/$x with a directory."
err=1
else
# The directory doesn't exist on the destination, so copy it
cp -Rp -- "$x" "$target/$x" || err=1
fi
elif [[ -f $x ]]; then
# We have a regular file. Copy it over if desired.
if [[ $x -nt $target/$x ]] && [ $(wc -c <"$x") -gt $(wc -c <"$target/$x") ]; then
cp -p -- "$x" "$target/$" || err=1
fi
else
# neither a file nor a directory. Overwrite the destination
cp -p -- "$x" "$target/$x" || err=1
fi
done