Ao mesclar diretórios com arquivos com nomes semelhantes, como garantir que apenas arquivos menores + anteriores sejam substituídos?

3

Por exemplo, se você quiser mesclar dois diretórios entre si (movendo tudo do diretório 1 para o diretório 2), o diretório 1 e o diretório 2 terão alguns arquivos com o mesmo nome.

Em seguida, como você pode escrever código de tal forma que se SharedFile é encontrado em ambos os diretórios, substitua SharedFile no diretório 2 com SharedFile no diretório 1 IF SharedFile é maior no diretório 1 e SharedFile tem uma modificação posterior data no diretório 1? (mas não substitua o SharedFile).

Estou bem com os scripts tcsh e bash.

    
por InquilineKea 22.06.2012 / 02:49

2 respostas

2

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
    
por 23.06.2012 / 03:31
1

De acordo com rsync --help :

 -u, --update                skip files that are newer on the receiver

Então, o comando que você provavelmente está procurando é:

rsync -auP sourcedir / destdir /

Em seguida, exclua sourcedir após o fato.

Claro, lembre-se da importância do trailing / no rsync.

Eu não sei se há um comportamento de rsync para tratar arquivos maiores da melhor forma ...

    
por 22.06.2012 / 03:14

Tags