web-dev-qa-db-ja.com

Fedora:cp:漢字で名前が付けられたファイルをvfatファイルシステムにコピーする際の無効な引数

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

1
Kepler

私はあなたにいくつかのメタアンサーを与えるつもりです。

まず、(バックグラウンドのみ) 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:奇妙な脱出

findxargsの両方に、フィールドの分離にNUL\0)文字を使用する機能があり、クレイジーな文字を回避できます。

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