bash - 大量重命名具有许多特殊字符的文件

时间:2013-11-29 14:21:05

标签: bash shell command-line rename batch-rename

我有很多文件(在单个目录中),如:

[a]File-. abc'.d -001[xxx].txt

所以有很多空格,撇号,括号和句号。它们之间的唯一区别是代替001的数字和代替xxx的字母。 如何删除中间部分,所以剩下的就是

[a]File-001[xxx].txt

我想解释一下这些代码是如何工作的,所以我可以将其用于其他用途,并希望能帮助回答其他类似的问题。

2 个答案:

答案 0 :(得分:2)

如果您拥有属于Perl发行版的rename(又名prename)实用程序,您可以说:

rename -n 's/([^-]*-).*-(.*)/$1$2/' *.txt

以所需格式重命名所有txt文件。上面的-n 执行实际的重命名,只有告诉你如果没有指定它会做什么。 (要执行实际重命名,请从上面的命令中删除-n。)

例如,这会重命名文件

[a]File-. abc'.d -001[xxx].txt

作为

[a]File-001[xxx].txt

关于解释,这会将第一个-的部分捕获到一个组中,将第二个(或最后一个)之后的部分捕获到另一个组合中并将它们组合起来。

了解Regular Expressions。如果您的系统上有可用的perl文档,请说perldoc perlre应该有帮助。

答案 1 :(得分:2)

以下是纯bash中的简单脚本:

for f in *; do            # for all entries in the current directory
  if [ -f "$f" ]; then    # if the entry is a regular file (i.e. not a directory)
    mv "$f" "${f/-*-/-}"  # rename it by removing everything between two dashes 
                          # and the dashes, and replace the removed part 
                          # with a single dash
  fi
done

3.5.3 Shell参数扩展

一章中,bash手册(命令为"${f/-*-/-}")中描述了info bash表达式中的魔术。

脚本第一行中的*模式可以替换为可以帮助缩小要重命名的文件列表的任何内容,例如: *.txt*File*.txt