多数のファイルをFAT32でフォーマットされたUSBドライブにコピーしたい(残念ながら、他のフォーマットはできません)。
これらのファイルの多くには、FAT32では許可されていない:
や?
などの文字を含む名前が付いています。 cp
またはrsync
を使用しようとすると、これらのファイルはコピーされず、そのことを示すエラーが報告されます。
ソースでファイルの名前を変更したくありませんが、宛先USBドライブでファイルの名前を変更することも気にしません。
目的の明確化(他のコメントにも適用されます):これは車のmp3プレーヤー用であり、ソフトウェアはFAT32のみを許可します。したがって、バックアップ用ではありません。また、ファイル名に奇妙な文字が含まれている理由は、たとえば、 mp3のタイトル、またはアーティストの名前。
私はいくつかのことを試しました:
--iconv
オプション。これはうまくいかなかったようですが、おそらく私はそれを正しく使用していませんでした。rdiff-backup
は、デフォルトでこの変換を行います。ただし、ソースファイルは私がたどりたいシンボリックリンク(つまり、rsyncの-L
オプション)であり、マンページからはrdiff-backup
にこのオプションがあるようには見えません。他に何か提案はありますか?
--iconv
を使用したRsyncはオプションですが、最初に?
、:
などがFATファイルシステムで許可されている文字でエンコードされるエンコードを定義する必要があります。
あなたのユースケースでは、これにrsyncのすべての機能を使用しているわけではありません。このタスクは、シェルスクリプトの数行で実行できます。
これは、~/Music
を/media/usb99
にコピーし、ターゲット上で古いファイルをスキップし、:
と?
を_
に変換するbashスクリプトです。衝突は検出されません(foo:bar.mp3
と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
このスクリプトは、わずかな変更を加えてzshで動作します。shopt -s dotglob globstar
をsetopt dot_glob
に、[[ $target -ot $source ]]
を[[ ! -e $target || $target -ot $source ]]
に置き換えます。
バックアップを目的としている場合は、tarballを隠してください。そのようにファイル名の煩わしさはありません。