Fedora

Fedora: cp: Invalid argument while coping a file with Chinese characters to a vfat filesystem

  • September 26, 2018

我想用來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

我會給你一些元答案。

首先,(僅用於背景)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命令的 inode 號引用文件,然後mv間接執行命令:

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

選項 2:奇數轉義

兩者findxargs可以使用NUL( \0) 字元進行欄位分隔,從而可以處理瘋狂的字元:

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

引用自:https://unix.stackexchange.com/questions/471468