如何处理“:”或“?”等字符使文件名无效?

如何处理“:”或“?”等字符使文件名无效?

我只是尝试移动包含音乐文件的目录,thunar 4.10 它抱怨文件名无效。

原来,有一个文件名(歌名)中含有一个问号。我怀疑这是一个问题,去掉了问号,确实可以复制文件。添加“?”回来是不可能的。我也在命令行上尝试过,rename但也不起作用。 (不确定 thunar 在底层使用什么,所以这个测试可能没有实际意义)

现在,如果问号使文件名无效,那么首先如何创建该文件呢?我SoundJuicer用新获得的 CD创建了这些文件。我能够在各种播放器中播放该文件(名称中带有“?”)。

这里发生了什么?我可以要“吗?”名义上还是名义上?为什么文件管理器无法处理此类文件,而其他应用程序似乎可以处理?

更新: 下一首歌曲中有一个“:”。与“?”相同的问题。

这些对于 Unix 来说不是无效字符;通常只有 NUL 字符和 / 字符是无效文件名(/ 是目录分隔符)。

这也是我的直觉告诉我的,因为我在 Linux 中从来没有遇到过任何文件名问题,并且可以将几乎所有合理的东西扔给它,而且它工作得很好。这就是这里提出问题的原因。我以前从未遇到过无效的文件名。

您是否尝试将文件移动到 U 盘?如果是,该棒是否格式化为 FAT32 还是本机 Linux 文件系统?

目标确实是我今天买的U盘。我打开了gparted,格式化为FAT32。

我不太确定,但那是 Windows 的事情,对吗? Windows 有很多不支持的字符,显然包括?:。我对吗?

答案1

这些字符在 FAT32 文件系统上?无效:,因此如果您需要在其中复制文件,将要需要重命名它们。

在命令行中,您可以使用命令行工具rename(有时称为prename)来替换这些字符,_甚至删除它们:

rename 's/[?<>\\:*|\"]/_/g'    # Change invalid characters to _
rename 's/[?<>\\:*|\"]//g'     # Remove invalid characters

我不熟悉thunar所以我不知道是否有办法直接执行这个替换/替换操作。

我刚刚发现Linux 复制到 fat32 文件系统:参数无效这建议将其添加到pax命令中(另一个复制文件的工具),以便您可以将完整文件名保留在本地磁盘上,但转换文件名复制过程中到您的 USB 设备:

pax -rw -s '/[?<>\\:*|\"]/_/gp' *.mp3 /media/usb_device

如果完整的文件名对您来说确实很重要,我建议您重新格式化 USB 记忆棒以使用 Linux 原生文件系统,例如ext4. (有可用的 Windows 驱动程序对于extN文件系统系列(如果有必要)。)

答案2

绝对允许?在文件名中包含它。

来自 POSIX 标准:

文件名

由 1 到 字节组成的字节序列,{NAME_MAX}用于命名文件。组成名称的字节不得包含<NUL><slash>字符。在路径名的上下文中,每个文件名后面应跟一个<slash>或 一个<NUL>字符;在其他地方,文件名后跟一个<NUL>字符形成一个字符串(但不一定是字符串)。文件名 dot 和 dot-dot 有特殊含义。文件名有时被称为“路径名组件”。另请参见路径名。

所以文件名中唯一可以使用的字符不是包含 is \0(表示字符串结尾)和/(这是路径分隔符)。此外,文件名...是特殊的,您创建的文件可能不会使用它们。

有些角色很特别到外壳并且需要转义或正确引用 shell 才能不将它们视为通配模式。问号就是这些字符之一,因为它通常代表 shell 通配模式中的“任何一个字符”。

我的猜测是 Thunar 选择不将这些文件名处理为字符:and ?(and <, >, ", |, \, and*使用在 Windows 上,并且它想强制您使用可在 Windows 和 Unix 之间移植的文件名。我不知道这背后的原因,但它可能与使 Thunar 在与 Windows 计算机共享的文件系统上工作有关。

编辑:在使用更多信息更新问题后,很明显,文件需要符合 Windows 命名规则,因为文件系统确实是 Windows 文件系统。

@roaima 的回答展示如何使用 Linuxrename实用程序重命名文件。这是另一种解决方案,适用于没有 函数的系统renamebash该函数fatmv通过将包含非法 Windows 字符的文件更改为下划线 ( _) 来重命名它们:

function fatmv {
    name="$( basename "$1" )"
    destdir="$2"

    fat_name="$( tr ':?<>"|\\*' '_' <<<"$name" )"

    if [[ -n "$destdir" ]]; then
      fat_name="$destdir"/"$fat_name"
    fi

    echo mv -f -- "$1" "$fat_name"
}

如果使用第二个参数,则将其视为应将重命名的文件移动到的目标目录:

$ fatmv '<illegal>:filename?' /mount/fat_disk/
mv -f -- <illegal>:filename? /mount/fat_disk//_illegal__filename_

按原样测试它,然后删除它echo以使其实际执行某些操作。

答案3

?是一个在 bash 中具有重要意义的特殊字符,您可以通过转义它来使用它\

IE:

touch test\?

将制作文件:

test?

你可以移动它

mv test\? /new/loction/test\?

编辑:对于任何特殊字符都相同,例如.

对于包含空格的文件名也需要它

this is a file

必须移动:

mv this\ is\ a\ file <location>

答案4

要应用 @serv-inc 和 @roaimas 不仅替换?目录中所有文件名称之外的所有其他字符(例如,非 FAT32 有效的 unicode 字符),您可以使用以下:命令:[A-Za-z0-9]_

for file in *.mp3 ; do var=$( echo $file | sed -e 's/[^A-Za-z0-9]/_/g'); var=${var:0:60} ; var=${var%_mp3}.mp3 ; mv "$file" $var ; done

我还遇到了 FAT32 上的 MP3 文件名太长的问题,因此它将基本名称削减为 60 个字符(我不知道最大长度,但 60 个字符适合我)。 当心覆盖通过移动文件来恢复原始文件名。

相关内容