重命名文件中的替换

时间:2012-01-04 11:58:21

标签: linux bash shell

我需要以下方面的帮助:

我有这些名称为ABC.rt1, ABC.rt2, ... , ABC.rt8

的文件

我应该按照以下方式重命名所有这些:如果数字,我们在结尾i.rt${i}是奇数,那么用appendig AB替换扩展名,否则用CD替换。例如,我希望这些输出:

ABC.rt1 - > ABC.rt1-AB

ABC.rt2 - > ABC.rt1-CD ......等等。

我尝试使用这个简单的脚本,但不起作用:

for i in `seq 1 8`; do mv -v ./ABC.rt${i} ./ABC.rt${if [ $(( $i % 2 )) -eq 0 ] ; then echo ${i}-CD; else echo ${i}-AB;fi};done

你能帮助我吗?

4 个答案:

答案 0 :(得分:4)

在这个具体的例子中,制作两个循环可能更容易吗?

for i in *[1357];do mv -v $i $i-AB;done
for i in *[2468];do mv -v $i $i-CD;done

如果需要创建一般解决方案,请告诉我,我会提供更多帮助。

答案 1 :(得分:2)

尝试:

for i in `seq 1 8`; do
  if [ $(( $i % 2 )) -eq 0 ] ; then
    newext=${i}-CD
  else
    newext=${i}-AB
  fi
  mv -v ./ABC.rt${i} ./ABC.rt$newext
done

不要尝试将所有内容填入一行,这是不可读的,并且您的语法最终不正确。

答案 2 :(得分:0)

perl -e'while(<*.rt?>) { rename $_, $_.($1 % 2 ? "-AB" : "-CD") if /\.rt(\d)$/ }'

在:

a.rt1  a.rt2

后:

a.rt1-AB  a.rt2-CD

注意:它与您问题中的示例不同。

答案 3 :(得分:0)

你走了,所有的bash,简短而简洁:

for f in *[1-8]
do
    mv $f $f-`echo $f | grep -q '[1357]$' && echo AB || echo CD`
done