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
次にUSBディスクを取り付けます。
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
ここでは、inode番号でファイルを参照して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/