Bash脚本:批处理文件重命名,以删除/更改Windows文件系统下的所有非法字符

我需要一个帮助,有一个项目需要修改特定目录中的文件和文件夹名称,以删除或替换任何和所有在Windows下被视为非法的字符,并添加一些其他字符。 留下最后的限制

ILLEGAL CHARACTERS:  (greater than) MAKE - : (colon) MAKE - " (double quote) REMOVE / (forward slash) MAKE - \ (backslash) MAKE - | (vertical bar or pipe) MAKE - ? (question mark) REMOVE * (asterisk) REMOVE ADDITIONAL CHARACTERS: REMOVE ' REMOVE % REMOVE # REMOVE ^ REMOVE !@#$%^&()=+][{};,`~ 

其旁边有“MAKE – ”的任何字符都需要用 – (连字符)代替字符,例如名为John \ Sykes.doc的文件需要成为John-Sykes.doc。 如果该字符被标记为“REMOVE”,那么它应该被移除,并且没有任何东西放在它的位置,例如名为John的文件?Sykes.doc将成为JohnSykes.doc

这是我们组织中一个非常大的项目中相当重要的一步,到目前为止我还没能创建一个脚本。 我知道如何制作简单的版本,只能根据具体情况改变文件名,但不能大量使用。 例如,我可以创建一个脚本只从文件名中删除@,但我不知道如何包含文件夹/目录,也不知道如何在这一个脚本中包含所有其他字符。

理想情况下,脚本将在第一次运行并使用echo生成一个文件,其中包含所有需要进行的更改,包括完整路径和更改后的路径。 然后需要稍微修改脚本以使用mv,或者它可以引用使用echo创建的文件并使用它执行所有必要的更改…

任何和所有的帮助将不胜感激,因为这是非常重要的,我现在缺乏自己的技能…

最后一点,我不能使用#rename命令。 它打破了我们的IT政策。

编辑

我无法使用任何版本的重命名,我的IT部门负责人。 禁止它。 我确信他有他的理由,但我不能说我知道他们。 重命名命令根本不在我们的服务器上。

这意味着我必须使用纯bash来执行操作。

没有任何额外要求。 基本上我需要能够运行一个脚本来输出在更改任何内容之前对文件所做的所有更改。 这将允许我们审查结果并确保没有填充物。 之后,我们想要运行(相同的脚本或不同的脚本)来实际进行更改。

我需要的只是上面所说的,所以标记为“MAKE – ”的任何东西都需要成为连字符,任何标记为“REMOVE”的东西都需要消失。

如果还有其他问题,请询问。 我很乐意给予进一步的评论。

创建脚本rename1.sh:

 #! /bin/bash old=$1 new=${old//[\''"?*%#^!@$&()=+[]{};,`~']} new=${new//['<>:\|']/-} # I removed /, see below. if [[ -e $new ]] ; then if [[ $old != $new ]] ; then echo Cannot rename "$old" to "$new" - target already exists. fi else mv "$old" "$new" fi 

它使用参数扩展根据给定规则重命名一个文件。 要重命名子树,请使用find运行它:

 find /path -exec rename1.sh {} \; 

你确定要更换/- ? 它会将所有文件放在同一目录中。