POSIXファイル名には、/
を除くすべての文字を含めることができますが、一部のファイルシステムでは?<>\\:*|"
などの文字を予約しています。 pax
を使用すると、これらの予約文字を置き換えながらファイルをコピーできます。
$ pax -rw -s '/[?<>\\:*|\"]/_/gp' /source /target
ただし、pax
にはrsync
のような--delete
オプションがなく、rsync
は文字を置き換えることができません。音楽コレクションを外付けハードドライブに定期的にバックアップする簡単な方法を探しています。
_/
_またはヌルバイト以外の任意の文字を使用したファイル名のサポートを含め、POSIXセマンティクスを使用してFATファイルシステムのビューを作成できます。 POSIXovl は比較的最近のものです Fuse このためのファイルシステム。
_mkdir backup-fat
mount.posixovl -S /media/sdb1 backup-fat
rsync -au /source backup-fat/target
_
VFATが受け入れないファイル名の文字は、%(XX)
としてエンコードされます。ここで、XX
は16進数です。 POSIXovl 1.2.20120215以降、%(3A)
のようなファイル名はそれ自体としてエンコードされ、_:
_としてデコードされるため、部分文字列を含むファイル名がある場合は衝突のリスクがあることに注意してください。 %(XX)
の形式の。
POSIXovlは長すぎるファイル名を処理しないことに注意してください。エンコードされた名前が255文字に収まらない場合、ファイルを保存できません。
POSIXovlは、unixのアクセス許可と所有権を_.pxovl.FILENAME
_というファイルに保存します。
私はこれに興味があったので、少し掘り下げました。
ソースからコンパイルしたい場合は、これを行うためのパッチがいくつかありますが、rsyncにはなりませんでした。どちらも古いので、まだ機能しない可能性があります。これは具体的に --fat-filenames
オプション を追加し、これは --tr
オプション 用に追加します。
これらの質問は、同様のこともカバーしています 特殊文字を含むファイルをUSB FAT32に同期する および https://askubuntu.com/questions/11634/how-can-i-substitute-colons-when -i-rsync-on-a-usb-key 。最善の策はおそらく、置換を行うrdiff-backupですが、それを制御するためのオプションが表示されません。他にも良いアイデアがいくつかあります。
ファイルが多すぎない場合、毎回ファイルを削除して再作成するスクリプトの大まかなアイデアは、次のようになります。
[Sudo] updatedb # doing this as root will update the system database
locate -r '^/full/path/to/source/.*[?<>\\:*|\"]' |
sed 's\^/full/path/to/source/\\' >bad_names
rsync --delete --exclude-from=bad_names -av source/ target
cd source
<bad_names pax -rw -s '/[?<>\\:*|\"]/_/gp' target
データベースが適度に最新の場合、locate
はfind
よりも高速になります。
最後に、ファイルがこれ以上問題を引き起こさないようにこれを行うことができます(少なくとも現在存在するもの):
find source/ -regex '[?<>\\:*|\"]' -exec rename 's/'[?<>\\:*|\"]'/_/g' {} +
何か問題が発生した場合に備えて、最初にrename -n
で試してみることをお勧めします。