Fedora:cp:将包含中文字符的文件复制到 vfat 文件系统时参数无效

Fedora:cp:将包含中文字符的文件复制到 vfat 文件系统时参数无效

我想用来cp将一个以汉字命名的文件复制到我的fat32 U盘上。这是使用脚本完成的,因此使用nautilus对我来说不是解决方案。我也不想重命名这些文件。我收到一个错误cp: cannot create regular file '测试.pdf': Invalid argument。在 Ubuntu 上,该cp命令完美运行。

区域设置:
LANG=en_US.UTF-8 LC_NUMERIC=en_GB.UTF-8 LC_TIME=en_GB.UTF-8 LC_MONETARY=en_GB.UTF-8 LC_PAPER=en_GB.UTF-8 LC_MEASUREMENT=en_GB.UTF-8

USB 记忆棒使用以下格式进行格式化:
sudo mkfs.vfat -n $volume_name /dev/$dev_name

然后我创建挂载目录:
sudo mkdir /run/media/piotr/$volume_name

然后安装 U 盘:
sudo mount /dev/$dev_name /run/media/piotr/$volume_name

答案1

我将给你一些元答案。

首先,(仅作为背景)FAT32 以奇怪的方式处理 UTF-8/UTF-16 文件名

很可能,它只是一个安装选项(如下所述)...以防万一,尽管我正在介绍其他一些选项...

第 1 步:检查您的安装选项。

当我尝试在 Fedora 中挂载 vfat 文件系统时,出现了以下选项:

$ grep vfat /proc/mounts
/dev/loop0 /tmp/tmp.Migr78uZ75 vfat rw,relatime,fmask=0022,dmask=0022,\
  codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro 0 0

显然iocharset=ascii是次优的。当我使用该选项重新安装时,iocharset=utf8它正确地表示了正确的iocharset值:

$ grep vfat /proc/mounts
/dev/loop0 /tmp/tmp.Migr78uZ75 vfat rw,relatime,fmask=0022,dmask=0022,\
  codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro 0 0

例子:

$ cp 测试.pdf /tmp/tmp.Migr78uZ75/
cp: cannot create regular file '/tmp/tmp.Migr78uZ75/测试.pdf': Invalid argument
$ sudo mount -o loop,iocharset=utf8  ~/vfat.img /tmp/tmp.Migr78uZ75/
$ cp 测试.pdf /tmp/tmp.Migr78uZ75/
$ echo $?
0
$ ls -li /tmp/tmp.Migr78uZ75/
total 0
167 -rwxr-xr-x. 1 root root 0 Sep 25 21:57 测试.pdf

接下来,移动文件时出现问题的情况比您想象的更频繁。根据情况的具体细节,我使用了一些变体此处引用的答案

总结一下:

选项 1:通过引用移动文件。

ext*文件通过其“inode”号存储在文件系统上。您可以通过将-i标志添加到以下位置来验证/查看此数字ls

$ ls -i
3312906 测试.pdf

从这里,可以通过命令的索引节点号来引用文件find,然后mv间接执行命令:

$ find * -inum 3312906  -exec mv "{}"  /tmp/tmp.Migr78uZ75/  \;

选项2:奇怪的转义

find和都xargs能够使用NUL( \0) 字符进行字段分隔,从而可以解决疯狂的字符:

$ find . -inum 3312906 -print0 | xargs -0 -I '{}' mv '{}' /tmp/tmp.Migr78uZ75/

相关内容