我有几个这样命名的文件: This is a test - AB12-1998.avi
(最后一个代码总是 2 个字母、2 个数字、破折号、4 位数字)
我想做的是像这样重命名它们: AB12-1998 - This is a test.avi
我很感激您可以使用 bash、重命名或任何其他方式为我提供的任何解决方案,只要它能完成工作。
使用 Perl rename
(*):
rename 's/^(.*) - (.*)(\..*)$/$2 - $1$3/' *.avi
Run Code Online (Sandbox Code Playgroud)
或者,如果您想对代码更严格:
rename 's/^(.*) - ([a-zA-Z]{2}\d{2}-\d{4})(\..*)$/$2 - $1$3/' *.avi
Run Code Online (Sandbox Code Playgroud)
这应该适用于类似的名称foo - bar - AB12-1234.avi
,因为第一个.*
贪婪地匹配到最后一个<space><dash><space>
.
(* 请参阅:所有重命名是什么:预命名、重命名、文件重命名?)
或者在 Bash 中类似:
for f in *.avi ; do
if [[ "$f" =~ ^(.*)\ -\ (.*)(\..*)$ ]]; then
mv "$f" "${BASH_REMATCH[2]} - ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
fi
done
Run Code Online (Sandbox Code Playgroud)
简而言之,正则表达式分解为
^ start of string
( ) capture group
.* any amount of anything
\. a literal dot
$ end of string
Run Code Online (Sandbox Code Playgroud)
大多数常规字符与自身匹配,但您需要在 Bash 中使用反斜杠转义空格(如上)。捕获组的内容在 Perl中按顺序出现在$1
, $2
etc 中${BASH_REMATCH[1]}
,${BASH_REMATCH[2]}
在 Bash中按顺序出现在, etc 中。
归档时间: |
|
查看次数: |
1843 次 |
最近记录: |