我们遇到一个问题,从连接到充当服务器的 Mac Mini 的旧 DAS 驱动器迁移的一组数据包含许多非法文件夹名称(即冒号:)。某些用户一定已经创建了这些文件,尽管 NAS 允许我迁移它们并且它们在 Synology 的内置文件浏览器中显示正常,但当从基于 Windows 或 Mac 的客户端访问它们时,文件夹名称已被自动替换生成唯一的文件夹名称。
我无论如何都不是 Linux 专家,所以我想知道是否有人可以帮我编写一个脚本,从这些文件夹中删除 :(冒号),以便他们的 Mac 计算机能够看到它们?
答案1
如果只是:
造成麻烦,您可以使用find
withrename
选项将该字符替换为其他字符。
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)或ksh93
is(该${var//pattern/replacement}
运算符实际上来自 ksh93),如果您替换bash
为ksh
上面的内容,也应该可以工作。与 相同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
被丢弃)。