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/