删除目录中所有文件名中最后一个带括号的字符串
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
以实际重命名文件。
我有很多歌曲文件要重命名。我试图删除所有歌曲文件名中最后一次出现的带括号的字符串。例如,它们的格式如下: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
以实际重命名文件。