我想用来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/