Rsyncing de archivos con caracteres especiales a USB FAT32

8

Quiero copiar una gran cantidad de archivos en una unidad USB con formato FAT32 (y desafortunadamente no se puede formatear nada más).

Muchos de estos archivos tienen nombres con caracteres como :y ?que FAT32 no permite. Intentando usar cpo rsync, estos archivos no se copian y se informa un error que lo indica.

No quiero cambiar el nombre de los archivos en la fuente, pero tampoco me importa cómo se les cambia el nombre a los archivos en la unidad USB de destino.

Aclaración sobre el propósito (se aplica también a los otros comentarios): Esto es para un reproductor de mp3 en un automóvil y el software solo permite FAT32. Entonces no es para propósitos de respaldo. Y las razones por las que los nombres de archivo tienen caracteres extraños es porque son, por ejemplo, títulos de mp3 o nombres de artistas.

He intentado un par de cosas:

  1. --iconvOpción de rsync . Esto no parecía funcionar, pero tal vez no lo usé correctamente.
  2. rdiff-backup, que leí hace esta conversión de forma predeterminada. Sin embargo, los archivos de origen son enlaces simbólicos que quiero seguir (es decir, la -Lopción de rsync ), y de las páginas del manual no parece que rdiff-backuptenga esta opción.

¿Cualquier otra sugerencia?

atorgovitsky
fuente
En primer lugar, ¿por qué no puede formatear la unidad USB y por qué tiene nombres de archivo con dos puntos y signos de interrogación? Aunque el sistema de archivos permite estos caracteres en la unidad de origen, tienden a ser problemáticos para el trabajo de shell y la portabilidad. Además, rsyncla --iconvopción no está hecha para lo que estás tratando de usar.
depquid 01 de
1
@depquid es solo un problema para el trabajo de shell si escribe código de shell defectuoso.
jordanm 01 de
@jordanm Estaba pensando más en el uso de shell interactivo. Claro que se puede hacer, pero trabajar con más caracteres estándar es más conveniente, en mi humilde opinión.
depquid 01 de
1
Para su información, --iconvhace conversiones de juego de caracteres, por ejemplo, latin1 <-> utf8. No es lo que estás buscando.
derobert 01 de
Pregunta similar sobre Ask Ubuntu: ¿Cómo puedo sustituir los dos puntos cuando rsync en una llave USB?
Gilles 'SO- deja de ser malvado'

Respuestas:

4

Rsync con --iconvsería una opción, pero primero debe definir una codificación donde ?, :y otras están codificadas con caracteres que están permitidos en los sistemas de archivos FAT.

Para su caso de uso, no está utilizando todo el poder de rsync para esto. Esta tarea se puede hacer en unas pocas líneas de script de shell.

Aquí hay un script bash que las copias ~/Musica /media/usb99, omitiendo los archivos que son mayores en el objetivo, y los convertidos :y ?para _. No detecta enfrentamientos (supongo que no tiene ambos foo:bar.mp3y foo?bar.mp3).

#!/bin/bash
set -e
shopt -s dotglob globstar
cd ~/Music
for source in **/*; 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 ]].

Gilles 'SO- deja de ser malvado'
fuente
2

Si es para propósitos de respaldo, solo guarde un tarball. No hay problemas de nombre de archivo de esa manera.

vonbrand
fuente
1
Aclaración sobre el propósito (se aplica también a los otros comentarios): Esto es para un reproductor de mp3 en un automóvil y el software solo permite FAT32. Entonces no es para propósitos de respaldo. Y las razones por las que los nombres de archivo tienen caracteres extraños es porque son, por ejemplo, títulos de mp3 o nombres de artistas.
atorgovitsky
3
@atorgovitsky Debe editar su pregunta original para proporcionar estos detalles.
depquid 01 de