我有许多视频文件的文件名如下
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/
– 替换a
为b
.+(_.+)_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_OUT
,EXTENSION
您可以将它们作为变量传递以自定义脚本,例如
./renamer.bash input_directory output_directory mkv