Fedora: CP: Неверный аргумент при копировании файла с именем китайскими символами на файловую систему VFAT

Часто код драйвера для Linux, который вы находите на случайных сайтах (т.е. не в исходном коде ядра или в каком-то выделенном репозитории с исходными кодами ядра для семейства связанных устройств), сильно устарел по сравнению с ядром. источники, против которых вы пытаетесь строить. Разработка Linux продвигается с головокружительной скоростью 24 часа в сутки, 7 дней в неделю. Неудивительно, что сборка не удалась.

Ищите людей, работающих с этим устройством (возможно, начните с имен, указанных в ванильном драйвере или, возможно, в его внутренней документации). Что-то может быть в постановке.

1
26.09.2018, 06:31
1 ответ

Я дам вам несколько мета--ответов.

Во-первых, (просто для фона)FAT32 обрабатывает имена файлов UTF -8/UTF -16 странным образом .

Более чем вероятно, что это просто вариант монтирования (, описанный ниже )... на всякий случай, хотя я рассматриваю несколько других вариантов...

Шаг 1 :Проверьте параметры крепления.

Когда я попытался смонтировать файловую систему vfat в Fedora, были представлены следующие варианты:

$ 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, а затем косвенно выполнять команду 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/
1
27.01.2020, 23:42

Теги

Похожие вопросы