删除目录中所有文件名中最后一个带括号的字符串

Remove last parenthesized string in all file names in a directory

我有很多歌曲文件要重命名。我试图删除所有歌曲文件名中最后一次出现的带括号的字符串。例如,它们的格式如下:song - artist (foo) (bar) (text I want to remove).mp3,但我希望输出为 song - artist (foo) (bar).mp3.

目前,我发现了一个 zsh 命令,可以删除所有带括号的字符串,如对此 post Renaming files to remove parenthesized strings.

的回答所示

几乎对我有用的 post 解决方案是使用此命令:

autoload zmv # best in ~/.zshrc
zmv -n '*' '${f//[[:space:]]#[(]*[)]}'

但是,这会删除所有文件名中 all 括号内的字符串。我只是想删除文件名中出现的 last 个带括号的字符串。

您可以使用 Bash 的贪婪正则表达式:

#!/bin/bash

re='(.*)(\([^)]*\))(.*)'

for file in *; do
    if [[ $file =~ $re ]]; then
        echo mv -i -- "$file" "${BASH_REMATCH[1]}${BASH_REMATCH[3]-}"
    fi
done

但是文件名扩展需要改进。

这个任务也可以通过使用模式匹配来完成,而不是正则表达式:

for f in *\(*\).*; do mv -- "$f" "${f% \(*\).*}"."${f##*.}"; done

请注意,这 不是 bash 特定的;它应该适用于任何 POSIX shell.

使用zmv的版本:

zmv -n '(*) \(*\).mp3' '.mp3'

对于 -n,此命令列出了将更改的内容。删除 -n 以实际重命名文件。