批量文件重命名

批量文件重命名

我有许多视频文件的文件名如下

F_S1_0001.mp4
F_S1_0002.mp4

在目录中,我想用如下文件名重命名它们

1_S1.mp4
2_S1.mp4

并通过编写脚本文件将其保存在新目录中。

答案1

使用rename( sudo apt install rename) 这是一个单行操作:

rename -n 's/.+(_.+)_0*(.+)\./\2\1./' F_S1_*.mp4

这只会展示首先,运行不-n带任何更改的行来实际执行重命名。移动文件也可以完成rename,但由于您没有提供任何细节,因此很难展示这一点。但是,您只需将对mv结果文件起作用的命令添加到列表中即可:

rename 's/.+(_.+)_0*(.+)\./\2\1./' F_S1_*.mp4 && mv *_S1.mp4 /path/to/other/dir/

解释

  • s/a/b/– 替换ab
  • .+(_.+)_0*(.+)\.– 匹配一个字符串,该字符串包含一个或多个字符 ( .+),后跟一个下划线和一个或多个字符,所有这些字符都保存为一个组 ( (_.+)),后跟一个下划线和任意数量的零 ( _0*),后跟一个或多个字符,这些字符保存为第二组 ( (.+)),后跟一个点 ( \.)
  • \2\1.– 扩展到第二组的内容,后跟第一组的内容和一个点
  • F_S1_*.mp4– 匹配以“F_S1_”开头并以“.mp4”结尾的任何文件
  • *_S1.mp4– 匹配任何以“_S1.mp4”结尾的文件

示例运行

$ tree
.
├── another_dir
├── F_S1_0001.mp4
└── F_S1_0002.mp4
$ rename -n 's/.+(_.+)_0*(.+)\./\2\1./' F_S1_*.mp4
F_S1_0001.mp4 -> 1_S1.mp4
F_S1_0002.mp4 -> 2_S1.mp4
$ rename 's/.+(_.+)_0*(.+)\./\2\1./' F_S1_*.mp4 && mv *_S1.mp4 another_dir/
$ tree
.
└── another_dir
    ├── 1_S1.mp4
    └── 2_S1.mp4

答案2

使用韓國重命名文件:

$ mmv '?_??_*[1-9]*.mp4' '#5#6_#2#3.mp4'

答案3

这是一个具有相应功能的 bash 脚本的示例。

创建文件“renamer.bash”,内容如下

#!/usr/bin/env bash

DIRECTORY_IN="${1:-dir1}"
DIRECTORY_OUT="${2:-dir2}"
EXTENSION="${3:-mp4}"

for FILENAME in "$DIRECTORY_IN"/*."$EXTENSION"; do
  # Find the base filename, excluding extension
  NAME_IN="$(basename "$FILENAME" ".$EXTENSION")"
  # Split the components of the name by underscores (_)
  NAME_ARR=(${NAME_IN//_/ })
  # Remove leading zeros from the last element
  NUMBER="$(echo ${NAME_ARR[2]} | sed 's/^0*//')"
  # Create the new name
  NAME_OUT="$DIRECTORY_OUT/${NUMBER}_${NAME_ARR[1]}.$EXTENSION"

  # Copy files to the output location
  cp "$FILENAME" "$NAME_OUT"

done

您可以将脚本中的“dir1”和“dir2”的值自定义为您的输入和输出目录。

使脚本可执行

chmod a+x renamer.bash

然后运行它

./renamer.bash

由于我设置变量的方式DIRECTORY_IN DIRECTORY_OUTEXTENSION您可以将它们作为变量传递以自定义脚本,例如

./renamer.bash input_directory output_directory mkv

相关内容