Fedora: cp: Invalid argument while coping a file with Chinese characters to a vfat filesystem
我想用來
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:奇數轉義
兩者
find
都xargs
可以使用NUL
(\0
) 字元進行欄位分隔,從而可以處理瘋狂的字元:$ find . -inum 3312906 -print0 | xargs -0 -I '{}' mv '{}' /tmp/tmp.Migr78uZ75/