批量重命名"复杂"文件名

时间:2017-11-13 18:47:32

标签: bash substring batch-rename

我在这个问题上遇到了困难。

我在一般名称格式的文件夹中有几个文件:

  

[ 文件类型 ] 文件名 日期< / em> 文件规范 文件扩展名

  • 文件类型可以是以下任何内容:网络研讨会,演示文稿,研讨会,口语交谈等...请注意它被[]包围并且可能包含空格。
  • 文件名可以是任何内容,请注意它可能包含空格。
  • 日期采用通用格式dd_mm_yyyy。请注意它被()包围。
  • 文件规范提供有关文件属性的一般信息(并不重要。

我想写一个脚本,所以我可以将文件夹中的所有文件重命名为以下格式:

  

日期 [ 文件类型 ] 文件名 。< / strong> 文件扩展名

应丢弃

()日期,日期应更改为格式ddmmyyyy,应保留文件类型周围的[],并忽略文件规范

示例:

[Oral Talk] Prospects for future research (13_11_2017) 1080p 320kpbs.mp4

应改为:

13112017 [Oral Talk] Prospects for future research.mp4

但是,应该对文件夹中的所有文件进行迭代。

1 个答案:

答案 0 :(得分:0)

#!/usr/bin/env bash

# use a regular expression with match groups to pick out pieces of the name
re='\[(.+)\] (.+) [(]([[:digit:]_]+)[)](.*)[.]([[:alnum:]]+)'
#     1      2        3                4       5

# if we were passed a directory name, change to it before running
if [[ $1 ]]; then cd -- "$1" || exit; fi

for name in *.*; do
  if [[ $name =~ $re ]]; then
    date=${BASH_REMATCH[3]}
    ext=${BASH_REMATCH[5]}
    type=${BASH_REMATCH[1]}
    topic=${BASH_REMATCH[2]}
    new_name="${date//_/} [$type] $topic.$ext"
    printf 'Renaming %q to %q\n' "$name" "$new_name" >&2
    [[ $dry_run ]] || mv -- "$name" "$new_name"
  else
    printf 'Filename %q does not match pattern; ignoring\n' "$name" >&2
  fi
done

如果以renaming-script名称保存并运行为:

dry_run=1 ./renaming-script directory-to-rename

...这只会打印一份报告,显示重命名的内容。删除dry_run=1后,它实际上会执行这些重命名操作。