Melakukan sinkronisasi file dengan karakter khusus ke USB FAT32

8

Saya ingin menyalin sejumlah besar file ke drive USB yang diformat FAT32 (dan sayangnya, tidak dapat diformat apa pun).

Banyak dari file ini memiliki nama dengan karakter seperti :dan ?yang FAT32 tidak izinkan. Mencoba menggunakan cpatau rsync, file-file ini tidak disalin dan sebuah kesalahan dilaporkan menyatakan demikian.

Saya tidak ingin mengubah nama file pada sumbernya, tetapi saya juga tidak peduli apa nama file tersebut pada drive USB tujuan.

Klarifikasi tujuan (berlaku untuk komentar lain juga): Ini untuk pemutar mp3 di dalam mobil dan perangkat lunak hanya memungkinkan FAT32. Jadi bukan untuk cadangan. Dan alasan nama file memiliki karakter aneh adalah karena mereka, misalnya judul mp3, atau nama artis.

Saya sudah mencoba beberapa hal:

  1. --iconvOpsi rsync . Tampaknya ini tidak berhasil, tetapi mungkin saya tidak menggunakannya dengan benar.
  2. rdiff-backup, yang saya baca tidak konversi ini secara default. Namun, file sumber adalah tautan simbolis yang ingin saya ikuti (yaitu -Lopsi rsync ), dan dari halaman manual sepertinya tidak rdiff-backupmemiliki opsi ini.

Ada saran lain?

atorgovitsky
sumber
Pertama-tama, mengapa Anda tidak bisa memformat ulang drive USB dan mengapa Anda memiliki nama file dengan titik dua dan tanda tanya di dalamnya? Meskipun karakter ini diizinkan oleh sistem file pada drive sumber, mereka cenderung bermasalah untuk pekerjaan shell dan portabilitas. Juga, rsync's --iconvpilihan tidak dibuat untuk apa yang Anda coba untuk menggunakannya untuk.
depquid
1
@depquid itu hanya masalah untuk kerja shell jika Anda menulis kode shell kereta.
jordanm
@jordanm Saya lebih memikirkan penggunaan shell interaktif. Tentu itu bisa dilakukan, tetapi bekerja dengan lebih banyak karakter standar lebih mudah, IMHO.
depquid
1
FYI, --iconvapakah konversi set karakter, misalnya, latin1 <-> utf8. Bukan yang Anda cari.
derobert
Pertanyaan serupa pada Tanya Ubuntu: Bagaimana saya bisa mengganti titik dua ketika saya rsync pada kunci USB?
Gilles 'SO- berhenti bersikap jahat'

Jawaban:

4

Rsync dengan --iconvakan menjadi opsi, tetapi pertama-tama Anda harus mendefinisikan suatu pengkodean di mana ?, :dan yang lain dikodekan dengan karakter yang diizinkan pada sistem file FAT.

Untuk kasus penggunaan Anda, Anda tidak menggunakan semua kekuatan rsync untuk ini. Tugas ini dapat dilakukan dalam beberapa baris skrip shell.

Berikut adalah script bash yang salinan ~/Musicke /media/usb99, melewatkan file yang lebih tua pada target, dan bertobat :dan ?untuk _. Itu tidak mendeteksi bentrokan (saya berasumsi Anda tidak memiliki keduanya foo:bar.mp3dan 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

Skrip ini berfungsi di bawah zsh dengan modifikasi kecil: ganti shopt -s dotglob globstardengan setopt dot_globdan [[ $target -ot $source ]]oleh [[ ! -e $target || $target -ot $source ]].

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Jika itu untuk tujuan cadangan, cukup sembunyikan tarball. Tidak ada kerepotan nama file seperti itu.

vonbrand
sumber
1
Klarifikasi tujuan (berlaku untuk komentar lain juga): Ini untuk pemutar mp3 di dalam mobil dan perangkat lunak hanya memungkinkan FAT32. Jadi bukan untuk cadangan. Dan alasan nama file memiliki karakter aneh adalah karena mereka, misalnya judul mp3, atau nama artis.
atorgovitsky
3
@atorgovitsky Anda harus mengedit pertanyaan awal Anda untuk memberikan perincian ini.
depquid