将文件名的最后一部分移到前面

Mar*_*Roi 3 shell rename

我有几个这样命名的文件: This is a test - AB12-1998.avi

(最后一个代码总是 2 个字母、2 个数字、破折号、4 位数字)

我想做的是像这样重命名它们: AB12-1998 - This is a test.avi

我很感激您可以使用 bash、重命名或任何其他方式为我提供的任何解决方案,只要它能完成工作。

ilk*_*chu 7

使用 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, $2etc 中${BASH_REMATCH[1]}${BASH_REMATCH[2]}在 Bash中按顺序出现在, etc 中。