Fedora: cp: Argumento inválido ao lidar com um arquivo nomeado com caracteres chineses para um sistema de arquivos vfat

1

Eu quero usar cp para copiar um arquivo chamado com caracteres chineses para o meu stick usb fat32. Isso é feito usando um script, portanto, usar nautilus não é uma solução para mim. Eu não quero renomear os arquivos também. Eu recebo um erro cp: cannot create regular file '测试.pdf': Invalid argument . No Ubuntu, o comando cp funciona perfeitamente.

A localidade: 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

O dispositivo USB é formatado usando:% sudo mkfs.vfat -n $volume_name /dev/$dev_name

Em seguida, crio o diretório mount:
sudo mkdir /run/media/piotr/$volume_name

E o pen drive USB é montado:
sudo mount /dev/$dev_name /run/media/piotr/$volume_name

    
por Kepler 26.09.2018 / 04:58

1 resposta

1

Vou lhe dar algumas meta-respostas.

Primeiro, (apenas para segundo plano) FAT32 lida com nomes de arquivos UTF-8 / UTF-16 em uma maneira estranha .

Mais do que provável, é apenas uma opção de montagem (coberta abaixo) ... apenas no caso de não estar cobrindo algumas outras opções ...

Etapa 1: verifique suas opções de montagem.

Quando tentei montar um sistema de arquivos vfat no Fedora, estas foram as opções apresentadas:

$ 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

Obviamente, iocharset=ascii está abaixo do ideal. Quando eu montar novamente com a opção iocharset=utf8 , ele representa corretamente o valor correto de 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

Exemplo:

$ 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

Em seguida, a situação de ter problemas ao mover arquivos acontece com mais frequência do que você imagina. Dependendo dos detalhes exatos da situação, usei variações em um número do respostas citadas aqui .

Para resumir um pouco:

Opção 1: mova o arquivo por referência.

O arquivo é armazenado em um sistema de arquivos ext* por seu número "inode". Você pode verificar / ver esse número adicionando o -i flag a ls :

$ ls -i
3312906 测试.pdf

A partir daqui, é possível referenciar o arquivo pelo seu número de inode com o comando find e, em seguida, executar um comando mv indiretamente:

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

Opção 2: escape estranho

Tanto find como xargs têm a capacidade de usar NUL ( %code% ) caracteres para separação de campo, permitindo trabalhar com caracteres malucos:

$ find . -inum 3312906 -print0 | xargs -0 -I '{}' mv '{}' /tmp/tmp.Migr78uZ75/
    
por 26.09.2018 / 07:13