重命名匹配表达式的文件

重命名匹配表达式的文件

我必须重命名许多 jpg 文件,例如将 Portrait_14-9-100390.jpg 重命名为 Portrait-9-100390.jpg,即删除 _nn 部分。我使用一个愚蠢的 shell 脚本完成了此操作:

sudo rename -f -v 's/_20//' /var/www/prod/110253/110253-IND/*.jpg

用 20 到 1 的行。它能完成工作,但我很确定有一种方法可以用一两行来完成。我完全不懂正则表达式,有人能帮我吗?谢谢

答案1

rename当前 Ubuntu 发行版上的命令使用 Perl 表达式。

您可以使用 在 Perl 正则表达式中匹配单个十进制数字\d。因此\d+对于一个或多个十进制数字的序列,或者\d{1,2}对于一个或两个数字,例如。s/_\d{1,2}//

请注意,如果您只想匹配,则上述内容将匹配_12in_123并将其转换为-_3确切地下划线后有 1 或 2 位数字,则可以添加负面前瞻, 喜欢s/_\d{1,2}(?!\d)//

perlre:字符类和其他特殊转义


或者,您可以使用 KSH 样式的扩展 glob 模式来匹配一个或多个数字+([0-9]),从而允许您使用简单的 bash shell 循环执行重命名:

shopt -s extglob

for f in *_+([0-9])*; do 
  echo mv -n -- "$f" "${f/_+([0-9])/}"
done

echo一旦您确认它做了正确的事情,就将其删除)。

扩展的 glob 没有 Perl 风格的环视,所以如果您需要排除较长的数字序列,您需要做一些*_[0-9]@(|[0-9])[^0-9]*不太一样的事情(匹配后面的非数字而不是不匹配后面的数字)。

在 zsh 中,你可以选择在 glob 表达式中使用数字范围,例如

autoload -Uz zmv

zmv -n  '*(_<1-20>)*' '${f/$1/}'

的文档zmv可以在 中找到man zshcontrib

答案2

使用此脚本

名称:renamefiles

#!/bin/bash

pattern="_[0-9]{1,2}"

for x in *
do
echo $x | grep -Eq $pattern
if [ $? == 0 ]
then
rmnum=$(echo $x | grep -oE $pattern)
mv -n $x $(echo $x | tr -d $rmnum);
fi
done

要执行它,您需要提供适当的权限

sudo chown {yourUsername} renamefiles
sudo chmod u+x renamefiles

最后执行它

./renamefiles

相关内容