¿Cómo puedo sustituir los dos puntos cuando sincronizo en una llave USB?

12

Me gustaría hacer una copia de seguridad de mi directorio de correo en una llave USB. Sin embargo, mi IMAP tiene una convención de nomenclatura extraña de que algo incluye un carácter de dos puntos (:). Como el USB está en formato de ventana, rsync no puede crear esos archivos. ¿Hay alguna forma de reemplazar el carácter de dos puntos por un guión bajo cuando se ejecuta rsync? (¿O para hacer la misma sincronización con otra herramienta?)

Solo algunos puntos que aclaré en los comentarios:

  • Esta es una copia de seguridad del peor de los casos , me gustaría poder leerla en una máquina Windows sin instalar nada.
  • Tengo muchos datos que se mantienen constantes. Así que ahorro mucho tiempo si tengo una herramienta que simplemente copia los archivos más nuevos.
  • No estoy buscando una reescritura de rsync. Estoy buscando una herramienta existente que se pueda usar de fábrica.

Gracias

Guillaume Coté
fuente

Respuestas:

8

Use rdiff-backup en lugar de rsync simple. Detectará y sustituirá automáticamente los caracteres que no son compatibles con el disco de destino, y también los volverá a poner como estaban cuando restaura a un sistema de archivos Unix. Produce un directorio desempaquetado que se parece al origen más un directorio adicional de metadatos.

billar
fuente
6

El enfoque más directo es aprovechar la capa del sistema de archivos para transformar los nombres de los archivos. Desde Ubuntu 12.04, existe un sistema de archivos FUSE que transforma los nombres de archivo en nombres que admite VFAT de Windows: fuse-posixovl Instalar fusible-posixovl .

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

O para evitar requerir acceso de root:

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

Los caracteres en los nombres de archivo que VFAT no acepta están codificados como %(XX)donde XXestán los dígitos hexadecimales. A partir de POSIXovl 1.2.20120215, tenga en cuenta que un nombre de archivo como %(3A)está codificado como sí mismo y se decodificará como :, por lo que existe el riesgo de colisión si tiene nombres de archivo que contienen subcadenas del formulario %(XX).

Tenga en cuenta que POSIXovl no hace frente a nombres de archivo que son demasiado largos. Si el nombre codificado no cabe en 255 caracteres, el archivo no se puede almacenar.

POSIXovl almacena los permisos y la propiedad de Unix en los archivos llamados .pxovl.FILENAME.


El siguiente bash ≥4 script copia ~/mail/foo:bara /media/usb99/mail/foo_bar, y de manera similar para todos los archivos debajo ~/mail. Se omiten los archivos que ya existen en el árbol de destino y que no son más antiguos que el origen.

#!/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 bajo zsh con modificaciones menores: reemplazar shopt -s dotglob globstarpor setopt dot_globy [[ $target -ot $source ]]por [[ ! -e $target || $target -ot $source ]].


Aquí hay un zsh de dos líneas (tres si cuenta las cargas automáticas). Es más corto, pero bastante avanzado y no muy legible.

autoload zargs zmv
zargs -- ~/mail/**/*(/e\''REPLY=/media/usb99/${${REPLY#$HOME/}//:/_}'\') -- mkdir -p --
zmv -C -Q -o -pu '~/mail/(**/)(*)(.)' '/media/usb99/mail/${1//:/_}${2//:/_}'
  • La zargslínea es equivalente a mkdir -p ~/mail/**/*(…), excepto que no se bombardeará si la longitud acumulada de los nombres de directorio es demasiado larga. Esa línea crea los directorios de destino según sea necesario.
  • ~/mail/**/*(/)se expande a todos los directorios debajo ~/mail(directorios solo debido al (/)final).
  • (/e\''…'\')selecciona solo directorios y ejecuta el código dentro de '...' para transformar cada nombre de archivo, que se almacena en la REPLYvariable.
  • ${${REPLY#$HOME/}//:/_}elimina el prefijo correspondiente al directorio de origen y cambia :a _.
  • zmv -C copia cada archivo que coincide con su primer operando (un patrón zsh) al nombre de archivo obtenido al expandir su segundo operando.
  • -o -pudice pasar -pua la cputilidad, para preservar los permisos y copiar solo los archivos actualizados. (Podríamos decirle a zsh que realice la verificación de actualización; sería un poco más rápido pero aún más críptico).
  • (.)selecciona solo archivos regulares. -Qdice que esto debe analizarse como un calificador global y no como un .paréntesis alrededor que indica una subexpresión.
  • $1y $2en el texto de reemplazo coinciden las expresiones entre paréntesis (**/)y *. ( **pierde su significado especial como cero o más niveles de subdirectorio si está entre paréntesis, a menos que los paréntesis contengan exactamente **/).

Inicialmente pensé en usar pax , que es una herramienta de archivo (aquí diseñada para usarse en modo de transferencia) que tiene una función de cambio de nombre de archivo (su -sopción). Sin embargo, las opciones -sy -uno funcionan juntas (la definición POSIX de pax literalmente dice que -udebe verificar un archivo del mismo nombre en el árbol de destino, en lugar del nombre del archivo transformado por -s; la implementación de pax en Ubuntu sigue la especificación literalmente en lugar de útilmente). Todavía es posible usarlo para hacer enlaces duros renombrados y luego copiar los enlaces duros (con rsync -auo pax -rw -pp -u) a los otros medios, pero se siente más problemas de lo que vale.

cd ~/mail
mkdir -p /media/usb99/mail
pax -rw -l -pp -s '!:!_!g' . ../mail.colonless
rsync -au ../mail.colonless/ /media/usb99/mail/
Gilles 'SO- deja de ser malvado'
fuente
Voy a tratar de usar pax. Tal vez podría mejorar su respuesta especificando el paquete necesario en ubuntu. No parece ser parte de la instalación normal.
Guillaume Coté
Simplemente agregando un solo paquete llamado pax lo hace funcionar.
Guillaume Coté
No genera nada, trato de agregar una opción -v para ver qué está pasando. Parece estar copiando todo cada vez. El punto de rsync es ser incremental, lo que me hizo ahorrar mucho tiempo cuando solo tengo unos pocos archivos modificados en medio de muchos archivos.
Guillaume Coté
Parece estar creando un directorio 'home' bajo la ruta que especifiqué. Se recomienda evitar cambiar el directorio en el script, ¿hay otra posibilidad de evitar la creación de todos esos directorios?
Guillaume Coté
Tomó cinco minutos en un segundo pase donde todo era idéntico. rsync hubiera tomado solo unos segundos. ¿Hay alguna opción que deba especificarse para que sea incremental?
Guillaume Coté
-1

Lo que hago con mi memoria USB y disco USB móvil es particionarlos con 2 particiones: una FAT32 y una ext4. El primero que puedo usar para intercambiar datos con usuarios que no son de Linux, el segundo para mi uso personal con mis sistemas Ubuntu (y tal vez para intercambiar con otros usuarios de Linux). En una partición ext4, no tendrá el problema ":".

JanC
fuente
Me gustaría que mi copia de seguridad sea legible en cualquier lugar en caso de que necesite información en una computadora con Windows. Si no, hubiera formateado la clave usb a un sistema de archivos unix. Es por eso que estoy preguntando acerca de la sustitución.
Guillaume Coté
Bueno, es posible leer al menos ext2 / ext3 en Windows si instala algunas herramientas o controladores de sistema de archivos. ¿Desea poder leerlo en todos los sistemas Windows, o solo en sus propios sistemas (donde podría instalar las herramientas necesarias si las necesita)?
JanC
Por cierto: en teoría, también debería ser posible almacenarlo en un sistema NTFS, pero la mayoría de las aplicaciones de Windows (incluida la mayoría de Microsoft) no admiten NTFS correctamente ...: P
JanC
Es una copia de seguridad de recuperación en el peor de los casos, por lo que quiero estar preparado para el caso cuando necesito algo rápido, no tengo derecho a instalar nada en una computadora.
Guillaume Coté
-2

Podrías usar tarpara crear un archivo. De esta manera, no tiene que cambiar los nombres y puede guardarlo en el sistema de archivos que desee.

david
fuente
Podría hacer lo mismo con un archivo zip o un tgz, pero va a reescribir el archivo que no ha cambiado cada vez. Como los medios tienen un número limitado de escritura y obtuve varios Gib de datos, me gustaría evitar reescribir todo solo porque se agregó un nuevo archivo de 1 kb.
Guillaume Coté
Las reescrituras en una memoria flash reciente están "limitadas" a un número de millones o al menos cientos de miles por lo general. Dudo que planees hacer tantas copias de seguridad. ;)
JanC
2
-1 -azv no crea un archivo, hace una copia en modo archivo, lo que significa que mantiene los atributos del archivo
João Pinto
sry, realmente pensé que rsync podría hacer eso, cambió a tar, pero no sé si tar puede hacer copias de seguridad incrementales. Sin embargo, JanC tiene razón y las reescrituras no deberían ser un problema.
David
Con respecto a los comentarios de JanC sobre reescrituras, no es solo el hecho de que hay un límite (la última vez que lo revisé, estaba más cerca de mil que un millón), sino también el hecho de que no me gusta esperar varias horas por algo que Debería ser menos de un minuto.
Guillaume Coté