我怎样才能编写一个递归遍历目录的脚本(或使用find命令),查找窗口不接受文件名的任何字符,然后将它们更改为下划线?
这样,当我重新启动时,我没有chkdsk删除我最近使用windows不喜欢的文件名添加的所有文件。
答案 0 :(得分:3)
solution you linked非常好,但不够详尽:
"
(/
也在列表中,但无关紧要,因为它不能成为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" ' \;