Como posso substituir dois pontos quando sincronizo uma chave USB?

12

Gostaria de fazer backup do meu diretório de email em uma chave USB. No entanto, meu IMAP possui uma convenção de nomenclatura estranha, que inclui algo como dois pontos (:). Como o USB está no formato de janela, o rsync falha ao criar esse arquivo. Existe uma maneira de substituir o caractere de dois pontos por um sublinhado ao executar o rsync? (Ou fazer a mesma sincronização com outra ferramenta?)

Apenas alguns pontos que esclareci nos comentários:

  • Este é um backup do pior cenário possível , eu gostaria de poder lê-lo em uma máquina Windows sem instalar nada.
  • Eu tenho muitos dados que permanecem constantes. Portanto, economizo muito tempo se tiver uma ferramenta que apenas copie os arquivos mais recentes.
  • Não estou procurando uma reescrita do rsync. Estou procurando uma ferramenta existente que possa ser usada imediatamente.

obrigado

Guillaume Coté
fonte

Respostas:

8

Use rdiff-backup em vez de rsync simples. Ele detectará e substituirá automaticamente os caracteres que não são suportados no disco de destino, além de colocá-los de volta como estavam quando você restaura um sistema de arquivos unix. Ele produz um diretório descompactado que se parece com a origem mais um diretório de metadados extra.

poolie
fonte
6

A abordagem mais direta é aproveitar a camada do sistema de arquivos para transformar os nomes dos arquivos. Desde o Ubuntu 12.04, existe um sistema de arquivos FUSE que transforma nomes de arquivos em nomes que o VFAT do Windows suporta: fuse-posixovl Instale o fusível-posixovl .

sudo mount.posixovl /media/sdb1
chown guillaume /media/sdb1
rsync -au ~/mail /media/sbd1/

Ou para evitar exigir acesso root:

mkdir ~/mnt
/sbin/mount.posixovl -S /media/sdb1 ~/mnt
rsync -au ~/mail ~/mnt/

Os caracteres nos nomes de arquivo que o VFAT não aceita são codificados como %(XX)onde XXestão os dígitos hexadecimais. A partir do POSIXovl 1.2.20120215, observe que um nome de arquivo como %(3A)é codificado como ele mesmo e será decodificado como :, para que haja risco de colisão se você tiver nomes de arquivo contendo substrings do formulário %(XX).

Cuidado que o POSIXovl não lida com nomes de arquivos muito longos. Se o nome codificado não couber em 255 caracteres, o arquivo não poderá ser armazenado.

O POSIXovl armazena permissões e propriedade unix em arquivos chamados .pxovl.FILENAME.


O script bash ≥4 a seguir copia ~/mail/foo:barpara /media/usb99/mail/foo_bare da mesma forma para todos os arquivos em ~/mail. Os arquivos que já existem na árvore de destino e que não são mais antigos que a origem são ignorados.

#!/bin/bash
set -e
shopt -s dotglob globstar
for source in "$HOME"/mail/**/*; do
  target=/media/usb99/${source#"$HOME"/}
  target=${target//:/_}
  if [[ -d $source ]]; then
    mkdir -p -- "$target"
  elif [[ $target -ot $source ]]; then
    cp -p -- "$source" "$target"
  fi
done

Este script funciona no zsh com pequenas modificações: substitua shopt -s dotglob globstarpor setopt dot_globe [[ $target -ot $source ]]por [[ ! -e $target || $target -ot $source ]].


Aqui está um zsh de duas linhas (três se você contar os carregamentos automáticos). É mais curto, mas bastante avançado e não muito legível.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • A zargslinha é equivalente a mkdir -p ~/mail/**/*(…), exceto que ela não será bombardeada se o comprimento acumulado dos nomes de diretório for muito longo. Essa linha cria os diretórios de destino conforme necessário.
  • ~/mail/**/*(/)expande para todos os diretórios em ~/mail(diretórios somente devido ao (/)final).
  • (/e\''…'\')seleciona apenas diretórios e executa ainda mais o código em '…' para transformar cada nome de arquivo, que é armazenado na REPLYvariável.
  • ${${REPLY#$HOME/}//:/_}remove o prefixo correspondente ao diretório de origem e muda :para _.
  • zmv -C copia cada arquivo que corresponde ao seu primeiro operando (um padrão zsh) para o nome do arquivo obtido expandindo seu segundo operando.
  • -o -pudiz para passar -pupara o cputilitário, a fim de preservar permissões e copiar apenas arquivos atualizados. (Poderíamos dizer ao zsh para executar a verificação da atualização; seria um pouco mais rápido, mas ainda mais enigmático.)
  • (.)seleciona apenas arquivos regulares. -Qdiz que isso deve ser analisado como um qualificador de glob e não como um .entre parênteses indicando uma subexpressão.
  • $1e $2no texto de substituição correspondem às expressões entre parênteses (**/)e *. ( **perde seu significado especial como zero ou mais níveis de subdiretório, se estiver entre parênteses, a menos que os parênteses contenham exatamente **/.)

Inicialmente, pensei em usar o pax , que é uma ferramenta de arquivamento (aqui destinada a ser usada no modo de passagem) que possui um recurso de renomeação de arquivos (sua -sopção). No entanto, os -se -uopções não funcionam juntos (a definição POSIX de pax literalmente diz que -udeve verificar um arquivo com o mesmo nome na árvore de destino, em vez do nome do arquivo transformado por -s; a implementação pax no Ubuntu segue a especificação literalmente ao invés de de forma útil). Ainda é possível utilizá-lo para criar links físicos renomeados e depois copiá-los (com rsync -auou pax -rw -pp -u) para outras mídias, mas parece haver mais problemas do que vale a pena.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Gilles 'SO- parar de ser mau'
fonte
Vou tentar usar o pax. Talvez você possa melhorar sua resposta especificando o pacote necessário no ubuntu. Não parece fazer parte da instalação normal.
Guillaume Coté
Basta adicionar um único pacote chamado pax para que funcione.
Guillaume Coté
Não produz nada, tento adicionar uma opção -v para ver o que está acontecendo. Parece estar copiando tudo o tempo todo. O objetivo do rsync é ser incremental, o que me fez economizar muito tempo quando só tenho alguns arquivos modificados no meio de muitos arquivos.
Guillaume Coté
Parece estar criando um diretório 'home' no caminho especificado. É recomendável evitar alterar o diretório no script. Existe outra possibilidade de evitar a criação de todos esses diretórios?
Guillaume Coté
Foram necessários cinco minutos em um segundo passe, onde tudo era idêntico. O rsync levaria apenas alguns segundos. Existe uma opção que precise ser especificada para torná-la incremental?
Guillaume Coté
-1

O que faço com meu cartão de memória USB e disco USB móvel é particioná-los com 2 partições: uma FAT32 e uma ext4. O primeiro que posso usar para trocar dados com usuários não-linux, o segundo para uso pessoal em meus sistemas Ubuntu (e talvez para trocar com outros usuários linux). Em uma partição ext4, você não terá o problema ":".

JanC
fonte
Gostaria que meu backup fosse legível em qualquer lugar, caso eu precisasse de informações em um computador Windows. Caso contrário, eu teria reformatado a chave usb em um sistema de arquivos unix. É por isso que estou perguntando sobre substituição.
Guillaume Coté
Bem, é possível ler pelo menos ext2 / ext3 no Windows se você instalar algumas ferramentas ou drivers do sistema de arquivos. Deseja poder lê-lo em todos os sistemas Windows ou apenas em seus próprios sistemas (onde você pode instalar as ferramentas necessárias, se precisar)?
JanC 06/11/10
BTW: em teoria, também deve ser possível armazená-lo em um sistema NTFS, mas a maioria dos aplicativos Windows (incluindo a maioria da Microsoft) não suporta NTFS corretamente ...: P
JanC
É um backup de recuperação de pior caso, por isso quero me preparar para o caso quando precisar de algo rápido, não tenho o direito de instalar nada em um computador.
Guillaume Coté
-2

Você pode usar tarpara criar um arquivo morto. Dessa forma, você não precisa alterar os nomes e pode salvá-lo no sistema de arquivos que desejar.

david
fonte
Eu poderia fazer o mesmo com um arquivo zip ou um tgz, mas ele vai reescrever o arquivo que não foi alterado a cada vez. Como a mídia possui um número limitado de gravações e obtive vários dados Gib, gostaria de evitar reescrever tudo porque apenas um novo arquivo de 1kb foi adicionado.
Guillaume Coté
As reescritas em uma memória flash recente são "limitadas" a um número de milhões ou pelo menos centenas de milhares normalmente. Duvido que você planeje fazer tantos backups. ;)
JanC
2
-1 -azv não cria um arquivo, ele não uma cópia modo de arquivamento que significa que mantém atributos de arquivo
João Pinto
sry, realmente pensei que o rsync poderia fazer isso, mudou para tar, mas não sei se o tar pode fazer backups incrementais. No entanto, JanC está certo e reescreve não deve ser um problema.
David #
Em relação aos comentários do JanC sobre reescritas, não é apenas o fato de haver um limite (da última vez que verifiquei, foi mais próximo de mil a um milhão), mas também o fato de eu não gostar de esperar várias horas por algo que deve demorar menos de um minuto.
Guillaume Coté