Fedora: cp: 중국어 문자가 포함된 파일을 vfat 파일 시스템에 복사할 때 잘못된 인수

Fedora: cp: 중국어 문자가 포함된 파일을 vfat 파일 시스템에 복사할 때 잘못된 인수

cp한자로 된 파일을 fat32 U 디스크에 복사하는데 사용하고 싶습니다 . 이것은 스크립트를 사용하여 수행되므로 사용은 nautilus나에게 해결책이 아닙니다. 이 파일의 이름도 바꾸고 싶지 않습니다. 오류가 발생합니다 cp: cannot create regular file '测试.pdf': Invalid argument. 우분투에서는 이 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/

관련 정보