我在这里需要帮助,正在进行一个项目,我们需要修改特定目录中的文件和文件夹名称,以便删除或替换在 Windows 下被视为非法的任何和所有字符,并使用一些额外的字符。保留最终扩展
ILLEGAL CHARACTERS:
< (less than) MAKE -
> (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”的内容都需要消失。
如果还有其他问题,请提出。我很乐意提供进一步的评论。
答案1
创建脚本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 {} \;
您确定要用 替换吗/
?-
它会将所有文件放入同一目录中。