用于更改包含非法字符的文件/文件夹名称的脚本 (Synology NAS)

用于更改包含非法字符的文件/文件夹名称的脚本 (Synology NAS)

我们遇到一个问题,从连接到充当服务器的 Mac Mini 的旧 DAS 驱动器迁移的一组数据包含许多非法文件夹名称(即冒号:)。某些用户一定已经创建了这些文件,尽管 NAS 允许我迁移它们并且它们在 Synology 的内置文件浏览器中显示正常,但当从基于 Windows 或 Mac 的客户端访问它们时,文件夹名称已被自动替换生成唯一的文件夹名称。

我无论如何都不是 Linux 专家,所以我想知道是否有人可以帮我编写一个脚本,从这些文件夹中删除 :(冒号),以便他们的 Mac 计算机能够看到它们?

答案1

如果只是:造成麻烦,您可以使用findwithrename选项将该字符替换为其他字符。

find /path/to/share -name "*:*" -exec rename 's/\:/_/' {} \;

请注意,我尚未对此进行测试,因此请先在示例数据上尝试。

答案2

如果bash在该系统上可用:

LC_ALL=C find /path/to/share -depth -name '*:*' -type d -exec bash -c '
  for file do
    base=${file##*/}
    mv -i "$file" "${file%/*}${base//:}"
  done' bash {} +

应删除:目录名称中的 s。

如果bash不可用,但是mksh(MirBSD shell,以及 Android 的 shell)或ksh93is(该${var//pattern/replacement}运算符实际上来自 ksh93),如果您替换bashksh上面的内容,也应该可以工作。与 相同zsh

请注意,如果 /path/to/share/foo:bar/path/to/share/foobar目录都存在,则mv -i /path/to/share/foo:bar /path/to/share/foobar实际上会foo:bar移至foobar.使用 的 GNU 实现mv,可以通过将-T选项传递给来避免这种情况,mv在这种情况下,您将得到(感谢-i)一个mv: overwrite '/path/to/share/foobar'?提示,如果您回答“是”并且foobar为空,foo:bar则将被重命名为foobar(并且旧的foobar被丢弃)。

相关内容