我只是尝试移动包含音乐文件的目录,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
实用程序重命名文件。这是另一种解决方案,适用于没有 函数的系统rename
,bash
该函数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 个字符适合我)。 当心这覆盖通过移动文件来恢复原始文件名。