将共享NTFS上的文件批量重命名为Windows样式文件名

时间:2013-12-24 20:45:14

标签: linux windows bash unix filesystems

我怎样才能编写一个递归遍历目录的脚本(或使用find命令),查找窗口不接受文件名的任何字符,然后将它们更改为下划线?

这样,当我重新启动时,我没有chkdsk删除我最近使用windows不喜欢的文件名添加的所有文件。

3 个答案:

答案 0 :(得分:3)

solution you linked非常好,但不够详尽:

  • 错过了一些字符from the complete list"/也在列表中,但无关紧要,因为它不能成为Linux中文件名的一部分)
  • 它没有解决名称
  • 中具有特殊字符的多级子目录的情况
  • 它没有涉及具有长名称的路径的情况

为了处理所有禁用字符,由于引用,命令变得有点复杂:

find /path/to -name '*[<>:"\\|?*]*' -exec bash -c "n=\$(sed 's/[<>:\"\\|?*]/_/g' <<< '{}'); echo '{}' \"\$n\"" \;

要处理多级目录,首先分别为目录运行命令,然后对文件运行命令:

find /path/to -type d ...
find /path/to -type f ...

如果任何目录有重命名的特殊字符,则需要多次重新运行第一个命令,直到不再有重命名为止。

要查找长度超过特定长度的文件,您可以使用如下命令:

find /path/to/ -name '?????*'

这是查找名称中至​​少包含5个字符的文件/目录的示例。我不知道windows中的限制是什么,但有一个限制,所以你可能想检查一下,并使用足够长的模式。

最后,太长的绝对路径也会产生问题。你可以找到这样最长的绝对路径:

find /path/to | awk '{print length($0)}' | sort -nr | head -n1

答案 1 :(得分:1)

查看tr shell命令(linux)并将其与find结合使用。

请注意,使用应该从Linux运行。 Windows无法区分目录和真实目录的软链接,因此最终会无限循环。

答案 2 :(得分:0)

我找到了这个班轮的答案:

find . -name "*[<>:\\|?*]*" -exec bash -c 'x="{}"; y=$(sed "s/[<>:\\|?*]\+/-/g" <<< "$x") && mv "$x" "$y" ' \;

Source