Linux 复制到 fat32 文件系统:无效参数

mo-*_*eph 13 linux filesystems cp filenames

当我使用 cp 将文件从 ext3 分区复制到 fat32 分区时:

cp -R /ext3/stuff /fat32/partition/
Run Code Online (Sandbox Code Playgroud)

我收到所有带有冒号和问号的文件的无效参数消息。

有没有办法让 cp 去除目标文件系统的无效字符?

编辑:我再次检查了 cp 的选项,除非我很愚蠢,否则那里什么都没有。我确定我可以写一个脚本,但感觉应该有一个更干净的解决方案!

Gil*_*il' 11

当您想要复杂的副本或重命名时,通常的怀疑对象是 GNU cp、来自 zsh、rsync 和 pax(或 cpio)的 zmv。cp 中没有重命名功能,rsync 中也没有(我认为)。虽然 zmv 可以重命名,但这与递归副本不太匹配。但是 pax 可以做到:

cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition
Run Code Online (Sandbox Code Playgroud)

这将每个更改*?:_. 警告:最低限度的测试。如果存在冲突,则最后复制的文件获胜。


dhi*_*ill 11

根据 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\'
Run Code Online (Sandbox Code Playgroud)

我尝试使用 vfat 文件系统和完善的pax命令将其复制到 Android 手机 MicroSDHC 卡上,直到一切正常。对于 Windows 和 Unicode,这可能还不够:

pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest
Run Code Online (Sandbox Code Playgroud)

您可能还想使用 -k 选项来确保没有覆盖(由于文件名冲突)。我在评论中给出的两个列表都不同于 Linux vfat 行为。