我必须重命名许多 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}//
请注意,如果您只想匹配,则上述内容将匹配_12
in_123
并将其转换为-_3
确切地下划线后有 1 或 2 位数字,则可以添加负面前瞻, 喜欢s/_\d{1,2}(?!\d)//
或者,您可以使用 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