web-dev-qa-db-ja.com

ファイルをVFATパーティションに同期するための最良の方法は何ですか?

POSIXファイル名には、/を除くすべての文字を含めることができますが、一部のファイルシステムでは?<>\\:*|"などの文字を予約しています。 paxを使用すると、これらの予約文字を置き換えながらファイルをコピーできます。

$ pax -rw -s '/[?<>\\:*|\"]/_/gp' /source /target

ただし、paxにはrsyncのような--deleteオプションがなく、rsyncは文字を置き換えることができません。音楽コレクションを外付けハードドライブに定期的にバックアップする簡単な方法を探しています。

7
Frank

_/_またはヌルバイト以外の任意の文字を使用したファイル名のサポートを含め、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

データベースが適度に最新の場合、locatefindよりも高速になります。

最後に、ファイルがこれ以上問題を引き起こさないようにこれを行うことができます(少なくとも現在存在するもの):

find source/ -regex '[?<>\\:*|\"]' -exec rename 's/'[?<>\\:*|\"]'/_/g' {} +

何か問題が発生した場合に備えて、最初にrename -nで試してみることをお勧めします。

2
Graeme