cp
を使用して、漢字で名前が付けられたファイルをfat32usbスティックにコピーしたいと思います。これはスクリプトを使用して行われるため、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
そして、USBスティックがマウントされます: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:参照によってファイルを移動します。
ファイルは、「inode」番号でext*
ファイルシステムに保存されます。 -i
フラグをls
に追加することで、この番号を確認/確認できます。
$ ls -i
3312906 测试.pdf
ここから、find
コマンドを使用してiノード番号でファイルを参照し、次に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/