問題: 在 Linux 系統複製檔案到 FAT32 filesystem 發生 Invalid argument 錯誤
原因: FAT32 檔名不得含有 * \ : " < > | ? 等字元
作法:
- 使用 pax 指令, 複製時變更非法字元
- 使用 mount.posixovl 自動轉換字元
操作環境: Linux Mint 17 (based on Ubuntu 14.04)
建立測試環境
$ mkdir /tmp/src /tmp/fat32 /tmp/fat32-remount
$ dd if=/dev/zero of=/tmp/fat32.img bs=1 seek=500M count=0
$ mkfs.vfat -F32 /tmp/fat32.img
$ sudo mount -o uid=myaccount,rw /tmp/fat32.img /tmp/fat32
$ vi /tmp/go#!/bin/bash touch questionmark? touch less\< touch more\> touch backslash\\ touch colon: touch asterisk\* touch pipe\| touch inch\" touch Abc touch abC$ cd /tmp/src
$ sh ../go
方式一: 使用 pax 指令, 複製時變更非法字元
$ sudo apt-get install pax
$ cd /tmp/src
$ pax -rw -s '/[*\\:"<>|?]/_/gp' * ../fat32/
$ ls /tmp/{src,fat32}
/tmp/fat32: Abc asterisk_ backslash_ colon_ inch_ less_ more_ pipe_ questionmark_ /tmp/src: abC asterisk* colon: less< pipe| Abc backslash\ inch" more> questionmark?
方式二: 使用 mount.posixovl 自動轉換字元
$ sudo apt-get install fuse-posixovl
$ mount.posixovl -S /tmp/fat32 /tmp/fat32-remount
$ cp /tmp/src/* /tmp/fat32-remount/
$ ls /tmp/{src,fat32,fat32-remount}
/tmp/fat32: abC backslash%(5C) inch%(22) more%(3E) questionmark%(3F) asterisk%(2A) colon%(3A) less%(3C) pipe%(7C) /tmp/fat32-remount: abC asterisk* backslash\ colon: inch" less< more> pipe| questionmark? /tmp/src: abC asterisk* colon: less< pipe| Abc backslash\ inch" more> questionmark?
ps. 由於 FAT32 檔名不分大小寫, 所以 Abc 與 abC 只會存在一個
Ref: