Linux复制到fat32文件系统:无效参数


12

当我使用cp将文件从ext3分区复制到fat32时:

cp -R /ext3/stuff /fat32/partition/

我收到所有带有冒号和问号的文件的无效参数消息。

有什么办法让cp清除目标文件系统的无效字符?

编辑:我再次检查了cp的选项,除非我很笨,否则里面什么也没有。我敢肯定我可以写一个脚本,但是感觉应该有一个更干净的解决方案!

Answers:


10

当您想要复杂的副本或重命名时,通常的怀疑对象是GNU cp,zsh中的zmv,rsync和pax(或cpio)。cp中没有重命名功能,rsync也没有(我认为)。尽管zmv可以重命名,但这与递归副本并不能很好地配合。但是pax可以做到:

cd /ext3
pax -rw -s '/[*?:]/_/gp' stuff /fat32/partition

这将每个更改*?:_。警告:经过最少测试。如果有冲突,则以最后复制的那个文件为准。


很好-以前没有用过pax。谢谢你帮我忙。
mo-seph

1
反斜杠也使vfat出现问题。也将其包括在regexp中。谢谢!
lzap

根据support.grouplogic.com/?p=1607的完整列表为:/?<> \:* | ” ^。同样,它不能以空格或点结尾,并且保留一些名称。Mtools的联机帮助页提供了更大的列表::?+ * = [] <>'“ \ / |
dhill 2012年

对于与我有相同问题的人,还有另外一个说明:pax不支持将-s与更新命令-u结合使用。即,即使已存在重命名的文件,它也将始终再次复制它们。我花了时间来找出有关。
balu 2014年

11

根据Gilles的帖子,我测试了以下列表:

#!/bin/sh
touch questionmark?
touch less<
touch less\<
touch more\>
touch backslash\\
touch colon:
touch asterisk\*
touch pipe\|
touch inch\"
touch carret\^
touch comma,
touch semicolon\;
touch plus+
touch equals=
touch lbracket[
touch rbracket]
touch quote\'

我试图通过vfat文件系统和完善的pax命令将其复制到Android手机MicroSDHC卡上,直到一切正常为止。对于Windows和Unicode来说,这可能还不够:

pax -rw -s '/[?<>\\:*|\"]/_/gp' source dest

您可能还希望使用-k选项来确保没有覆盖(由于文件名冲突)。我在评论中给出的两个列表都与Linux vfat行为不同。


0

使用cp -r source usbstick复制时收到“无效参数”,发现原因是源文件名以空格结尾。删除空格将清除该消息。在这种情况下,名称不正确的文件发生在邮件程序目录中。


0

我只是有必要这样做,尽管pax基于-的答案很好,但仍然遇到带重音符号的问题。

因此,我发现使用起来更简单,tar并用下划线替换了所有不允许的字符:

cd /parent-of-source
tar cf - Söurce | (cd /destination; tar xvf - --transform='s/[^A-Za-z0-9\/ ]/_/g')

毫无疑问,可以比上面的列表提供更好的允许字符列表,但这是可行的。


0

在阅读了这个非常有趣的问题的答案并尝试了Android(exfat)和汽车娱乐系统(vfat)的SD卡后,我想到了这个小bash脚本。

#! /bin/bash

DST=$1
# copy music to FAT media

find music/ Music/ -type f | while read f ; do
    d=$DST/$( echo $f | sed 's/[^-A-Za-z0-9/._ ()]/_/g' )

    echo :$d:
    mkdir -p "$(dirname "$d")"
    cp -n "$f" "$d"

done

它以目的地(挂载点)作为参数,并用于find查找我的音乐存储库中的所有文件。

对于每个文件路径,它通过在目标之前添加并用下划线替换任何有问题的字符来计算目标路径和文件名_。我使用的字符的白名单(字母,数字,-/.()_),以消除任何不必要的标点符号。

视语言环境而定,这将在路径和文件名中留下带重音的字母,这似乎对于现代FAT文件系统来说是可以的。

对于每个目标文件路径和名称,使用会根据需要创建目录mkdir -p,然后复制文件(除非文件已存在)。

请注意"在不同地方的引号字符,要求它们保持路径和名称之间的空格不分开。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.