回答:
複雑なコピーや名前の変更が必要な場合の通常の疑いは、GNU cp、zshのzmv、rsync、pax(またはcpio)です。cpには名前変更機能も、rsyncにも(と思う)名前変更機能はありません。zmvは名前を変更できますが、これは再帰的なコピーではうまく機能しません。しかし、paxはそれを行うことができます。
cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition
これにより、それぞれが*?:
に変わります_
。警告:最小限のテスト。衝突がある場合、最後にコピーされたファイルが優先されます。
ジルの投稿に基づいて、次のリストをテストしました。
#!/bin/sh
touch questionmark?
touch less<
touch less\<
touch more\>
touch backslash\\
touch colon:
touch asterisk\*
touch pipe\|
touch inch\"
touch carret\^
touch comma,
touch semicolon\;
touch plus+
touch equals=
touch lbracket[
touch rbracket]
touch quote\'
pax
すべてが機能するまで、vfatファイルシステムと洗練されたコマンドを使用して、AndroidフォンのMicroSDHCカードにコピーしようとしました。それでも、WindowsとUnicodeでは十分ではありません。
pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest
-kオプションを使用して、上書きがないことを確認することもできます(ファイル名の衝突による)。コメントで私が付けたリストは両方とも、Linux vfatの動作とは異なりました。
この非常に興味深い質問への回答を読んで、Android用SDカード(exfat)とカーエンターテイメントシステム(vfat)を試した後、この小さなbashスクリプトを作成しました。
#! /bin/bash
DST=$1
# copy music to FAT media
find music/ Music/ -type f | while read f ; do
d=$DST/$( echo $f | sed 's/[^-A-Za-z0-9/._ ()]/_/g' )
echo :$d:
mkdir -p "$(dirname "$d")"
cp -n "$f" "$d"
done
宛先(マウントポイント)を引数として使用find
し、音楽リポジトリ内のすべてのファイルを見つけるために使用します。
各ファイルパスについて、宛先を先頭に追加し、問題のある文字をアンダースコアで置き換えることにより、宛先パスとファイル名を計算します_
。私は文字(文字、数字、のホワイトリストを使用-
、/
、.
、。
(
、)
との_
不要な句読点を削除します)。
ロケールによっては、パスとファイル名にアクセント記号付きの文字が残ります。これは、最近のFATファイルシステムでは問題ないようです。
宛先ファイルのパスと名前ごとに、を使用して必要に応じてディレクトリが作成されmkdir -p
、ファイルが既に存在しない限りコピーされます。
"
さまざまな場所の引用文字に注意してください。スペースを含むパスと名前がバラバラにならないようにするために必要です。