web-dev-qa-db-ja.com

特殊文字を含むファイルをUSBFAT32に同期する

多数のファイルをFAT32でフォーマットされたUSBドライブにコピーしたい(残念ながら、他のフォーマットはできません)。

これらのファイルの多くには、FAT32では許可されていない:?などの文字を含む名前が付いています。 cpまたはrsyncを使用しようとすると、これらのファイルはコピーされず、そのことを示すエラーが報告されます。

ソースでファイルの名前を変更したくありませんが、宛先USBドライブでファイルの名前を変更することも気にしません。

目的の明確化(他のコメントにも適用されます):これは車のmp3プレーヤー用であり、ソフトウェアはFAT32のみを許可します。したがって、バックアップ用ではありません。また、ファイル名に奇妙な文字が含まれている理由は、たとえば、 mp3のタイトル、またはアーティストの名前。

私はいくつかのことを試しました:

  1. rsyncの--iconvオプション。これはうまくいかなかったようですが、おそらく私はそれを正しく使用していませんでした。
  2. 私が読んだrdiff-backupは、デフォルトでこの変換を行います。ただし、ソースファイルは私がたどりたいシンボリックリンク(つまり、rsyncの-Lオプション)であり、マンページからはrdiff-backupにこのオプションがあるようには見えません。

他に何か提案はありますか?

8
atorgovitsky

--iconvを使用したRsyncはオプションですが、最初に?:などがFATファイルシステムで許可されている文字でエンコードされるエンコードを定義する必要があります。

あなたのユースケースでは、これにrsyncのすべての機能を使用しているわけではありません。このタスクは、シェルスクリプトの数行で実行できます。

これは、~/Music/media/usb99にコピーし、ターゲット上で古いファイルをスキップし、:?_に変換するbashスクリプトです。衝突は検出されません(foo:bar.mp3foo?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

このスクリプトは、わずかな変更を加えてzshで動作します。shopt -s dotglob globstarsetopt dot_globに、[[ $target -ot $source ]][[ ! -e $target || $target -ot $source ]]に置き換えます。

バックアップを目的としている場合は、tarballを隠してください。そのようにファイル名の煩わしさはありません。

2
vonbrand