Linux重命名多个非UTF-8编码的文件

3
我有一些旧的Samba服务器文件,文件名中的特殊字符如ä、ö、ü、õ无法显示,而是显示为?号。因此,我的客户无法打开这些文件或文件夹。他们看到了文件和文件夹,但名称为空。在服务器上,它们像这样显示:例如T??tunnid.doc。
一旦我使用mv命令重命名它们,那么我的客户就可以毫无问题地打开文件夹和文件。
是否有人知道任何脚本,我可以用它来重命名所有具有?标记的文件。所以他们显示为-。我想重命名特定文件夹中的文件,例如/samba/documents/...

或许可以使用rename来完成? - user180100
我已经研究过重命名。据我所知,它只能找到并重命名特定扩展名的文件,比如我想重命名.doc文件等。但是还有文件夹、文档、图片等等。所以类似于如果名称包含问号,则替换为减号(我知道这不是代码,只是举个例子)。 - undefined
我对Samba的问题有疑问。它类似于错误的“mount”选项。请检查您的“fstab”。 - undefined
这不是Samba的问题,而是旧服务器的编码问题。即使使用rsync更改编码选项也无法解决。现在有超过2000个需要重命名的文件,我不想手动操作。 - undefined
不,Windows用户根本看不到文件名。它显示文件或目录存在于服务器上,但他们无法打开它,名称为空,但在Linux中,我可以看到它的名称是T??tunnid,例如。 - undefined
显示剩余2条评论
3个回答

3

您可以尝试使用 convmv 工具,它可以更改文件名的字符编码。通常情况下,出现问号 ? 表示文件名的编码与终端、文件系统或其他某些东西不同。请尝试确定您的文件使用哪种字符编码,并按以下方式运行:

convmv -fcp1251 -tutf8 *

您可以编写简单的脚本或仅使用Shell循环来遍历目录并重命名所有需要的文件:

find /full/path -execdir convmv --notest -fcp1251 -tutf8 {} \;

但首先确保您使用正确的字符编码。


如果我理解正确,它之前运行正常,但最近出现了故障。所以问题可能出在最近的操作上。 - undefined
当它还在他们的旧服务器上时,它确实正常工作。但是一旦我们接管了管理工作,并用更好的服务器替换了原来的服务器,并同步了这些文件,问题就出现了。 - undefined
它们的编码是二进制的 :S - undefined
什么是“二进制编码”?我在谈论文件名,而不是文件本身。 - undefined
你在从旧服务器上抽取文件之前使用mount命令吗? - undefined
额???挂载是用来干什么的?这是通过网络使用rsync完成的。我不需要挂载任何东西。一切都已经挂载好了。 - undefined

0

我检查了重命名命令,我觉得它应该可以工作。

rename "s/[^A-Za-z0-9-_]/_/g"

但是我要如何将一个目录添加到它中呢?这样它就只会检查那个目录,而不是整个 Ubuntu 。

0
我不100%确定这个会不会起作用,所以我想要一些确认。
find . -type d -name '*?*' -execdir rename '?' '_' {} \;

1
这不会起作用。问号表示该符号无法显示,许多符号可以像这样显示。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接