Answers:
当您想要复杂的副本或重命名时,通常的怀疑对象是GNU cp,zsh中的zmv,rsync和pax(或cpio)。cp中没有重命名功能,rsync也没有(我认为)。尽管zmv可以重命名,但这与递归副本并不能很好地配合。但是pax可以做到:
cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition
这将每个更改*?:
为_
。警告:经过最少测试。如果有冲突,则以最后复制的那个文件为准。
根据Gilles的帖子,我测试了以下列表:
#!/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\'
我试图通过vfat文件系统和完善的pax
命令将其复制到Android手机MicroSDHC卡上,直到一切正常为止。对于Windows和Unicode来说,这可能还不够:
pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest
您可能还希望使用-k选项来确保没有覆盖(由于文件名冲突)。我在评论中给出的两个列表都与Linux vfat行为不同。
在阅读了这个非常有趣的问题的答案并尝试了Android(exfat)和汽车娱乐系统(vfat)的SD卡后,我想到了这个小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
,然后复制文件(除非文件已存在)。
请注意"
在不同地方的引号字符,要求它们保持路径和名称之间的空格不分开。