当我使用 cp 将文件从 ext3 分区复制到 fat32 分区时:
cp -R /ext3/stuff /fat32/partition/
我收到所有带有冒号和问号的文件的无效参数消息。
有什么方法可以让 cp 删除目标文件系统的无效字符?
编辑:我再次检查了 cp 的选项,除非我太笨,否则里面什么都没有。我确信我可以编写一个脚本,但感觉应该有一个更干净的解决方案!
答案1
当您需要复杂的复制或重命名时,通常的首选是 GNU cp、zsh 中的 zmv、rsync 和 pax(或 cpio)。cp 没有重命名功能,我认为 rsync 也没有。虽然 zmv 可以重命名,但这与递归复制不太相符。但 pax 可以做到:
cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition
这会将每个文件更改*?:
为_
。警告:仅进行了最低限度的测试。如果发生冲突,则最后复制的文件将获胜。
答案2
根据 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 行为不同。
答案3
使用 cp -r source usbstick 进行复制时,我收到“参数无效”提示,发现原因是源文件名以空格结尾。删除空格后,该消息便消失了。顺便说一下,在这种情况下,名称不正确的文件恰好位于邮件程序目录中。
答案4
在阅读了这个非常有趣的问题的答案并对 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
,然后复制文件,除非该文件已经存在。
请注意各处的引号"
字符,它们用于防止路径和名称中的空格断裂。