将带有特殊字符的文件名复制到外部 ntfs 卷

将带有特殊字符的文件名复制到外部 ntfs 卷

我正在尝试Documents and Settings使用 Puppy Linux 的 USB Live 将 Windows XP 系统的文件夹复制到 NTFS 外部磁盘。

我遇到了名称文件的编码问题,其中系统无法识别意大利特殊字符(utf-8 的一部分),因此使用cp或 GUI 文件管理器将带来错误invalid or incomplete multibyte or wide character

如何将名称中包含特殊字符的文件复制到NTFS驱动器?

答案1

您确定文件名在 NTFS 文件系统上有效吗?

您是否要求文件名保持不变?

如果没有,您可以删除“奇怪”的字符以使您的生活更轻松:

有一个工具可以做到这一点,detox

您可以在不首先更改文件名的情况下检查将重命名的内容:

$ detox -n somedir/*

然后,实际去做:

$ detox somedir/*



另一种方法是以某种方式挂载 NTFS 文件系统,使其自行清理(“净化”)文件名。

有一个安装选项可以启用此功能windows_names

man ntfs-3g:

  windows_names
              This option prevents files, directories and extended  attributes
              to be created with a name not allowed by windows, either because
              it contains some not  allowed  character  (which  are  the  nine
              characters  "  * / : < > ? \ | and those whose code is less than
              0x20) or because the  last  character  is  a  space  or  a  dot.
              Existing such files can still be read (and renamed).

答案2

rsync 可以选择更改文件名以适应目标文件系统。从手册页:

--iconv=CONVERT_SPEC

Rsync 可以使用此选项在字符集之间转换文件名。使用 CONVERT_SPEC 为“.”告诉 rsync 通过区域设置查找默认字符集。或者,您可以通过按顺序提供以逗号分隔的本地和远程字符集来完全指定要执行的转换 --iconv=LOCAL,REMOTE,例如 --iconv=utf8,iso88591。此顺序可确保无论您是推送还是拉取文件,该选项都保持不变。

尝试

rsync --iconv=. --archive /source /destination 

或者指定本地文件系统是 ISO-8859-1,

rsync --iconv=ISO-8859-1,. --archive /source /destination

当我在本地安装了两个驱动器时,我无法弄清楚它如何决定哪个文件系统是源,哪个是目标。但这就是对我有用的方式。

答案3

添加iocharset=utf8到您的安装选项,例如

mount -o iocharset=utf8 /dev/sdd1 /mnt/external

现在,您可以将违反 MS Windows 标准的文件复制到 NTFS 分区。

如果您在 Windows 下在外部驱动器上执行此操作,这将导致问题chkdsk,但您可以小心,不要损坏您的文件系统。 :-)

相关内容