Risincronizzazione di file con caratteri speciali su USB FAT32


8

Voglio copiare un gran numero di file su un'unità USB formattata FAT32 (e purtroppo non può essere formattata in altro modo).

Molti di questi file hanno nomi con caratteri come :e ?che FAT32 non consente. Tentando di utilizzare cpo rsync, questi file non vengono copiati e viene segnalato un errore che lo afferma.

Non voglio rinominare i file alla fonte, ma non mi interessa nemmeno come si chiamano i file sull'unità USB di destinazione.

Chiarimento sullo scopo (vale anche per gli altri commenti): questo è per un lettore mp3 in auto e il software consente solo FAT32. Quindi non è a scopo di backup. E la ragione per cui i nomi dei file hanno caratteri strani è perché sono, ad esempio titoli di mp3 o nomi di artisti.

Ho provato un paio di cose:

  1. --iconvopzione di rsync . Questo non sembra funzionare, ma forse non l'ho usato correttamente.
  2. rdiff-backup, che ho letto fa questa conversione per impostazione predefinita. Tuttavia, i file di origine sono collegamenti simbolici che desidero seguire (cioè l' -Lopzione di rsync ) e dalle pagine man non sembra che rdiff-backupabbia questa opzione.

Altri suggerimenti?


Prima di tutto, perché non riesci a riformattare l'unità USB e perché hai nomi di file con due punti e punti interrogativi? Anche se questi caratteri sono consentiti dal filesystem sull'unità sorgente, tendono ad essere problematici per il lavoro della shell e la portabilità. Inoltre, rsyncl' --iconvopzione non è fatta per quello per cui stai cercando di usarla.
depquid

1
@depquid è solo un problema per il lavoro della shell se si scrive un codice di buggy shell.
Giordania,

@jordanm Stavo pensando di più sull'uso interattivo della shell. Certo che può essere fatto, ma lavorare con caratteri più standard è più conveniente, IMHO.
depquid

1
Cordiali saluti, --iconvesegue conversioni di set di caratteri, ad esempio latin1 <-> utf8. Non è quello che stai cercando.
derobert

Risposte:


4

Rsync with --iconvsarebbe un'opzione, ma prima dovresti definire una codifica dove ?, :e altri sono codificati con caratteri consentiti su filesystem FAT.

Per il tuo caso d'uso, non stai usando tutto il potere di rsync per questo. Questa attività può essere eseguita in poche righe di script di shell.

Ecco uno script bash che copia ~/Musicin /media/usb99, saltando i file più vecchi sulla destinazione e li converte :e ?in _. Non rileva gli scontri (suppongo che tu non abbia entrambi foo:bar.mp3e 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

Questo script funziona con zsh con piccole modifiche: sostituisci shopt -s dotglob globstarcon setopt dot_globe [[ $target -ot $source ]]con [[ ! -e $target || $target -ot $source ]].


2

Se è a scopo di backup, basta riporre un tarball. Nessun problema di nome file in questo modo.


1
Chiarimento sullo scopo (vale anche per gli altri commenti): questo è per un lettore mp3 in auto e il software consente solo FAT32. Quindi non è a scopo di backup. E la ragione per cui i nomi dei file hanno caratteri strani è perché sono, ad esempio titoli di mp3 o nomi di artisti.
atorgovitsky,

3
@atorgovitsky È necessario modificare la domanda originale per fornire questi dettagli.
depquid
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.