Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 重命名文件中的替换_Linux_Bash_Shell - Fatal编程技术网

Linux 重命名文件中的替换

Linux 重命名文件中的替换,linux,bash,shell,Linux,Bash,Shell,我需要以下方面的帮助: 我有这些文件的名称:ABC.rt1,ABC.rt2,ABC.rt8 我应该按以下方式重命名它们:如果在.rt${I}末尾的数字是奇数,那么用appendig AB替换扩展名,否则用CD替换扩展名。例如,我期望这些输出: ABC.rt1-->ABC.rt1ab ABC.rt2-->ABC.rt1 CD。。。等等 我尝试使用此简单脚本,但不起作用: for i in `seq 1 8`; do mv -v ./ABC.rt${i} ./ABC.rt${if [ $(( $i

我需要以下方面的帮助:

我有这些文件的名称:
ABC.rt1,ABC.rt2,ABC.rt8

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

ABC.rt1
-->
ABC.rt1ab

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
你能帮我吗?

试试:

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
不要试图把所有这些都塞进一行,因为这是不可读的,而且你的语法也不正确。

试试:

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

不要试图把所有这些都塞进一行,这是不可读的,你的语法也不正确。

在这个特定的例子中,可能更容易做两个循环

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

如果需要创建通用解决方案,请让我知道,我会提供更多帮助。

在这个特定示例中,创建两个循环可能更容易

for i in *[1357];do mv -v $i $i-AB;done
for i in *[2468];do mv -v $i $i-CD;done
perl -e'while(<*.rt?>) { rename $_, $_.($1 % 2 ? "-AB" : "-CD") if /\.rt(\d)$/ }'
如果需要创建通用解决方案,请让我知道,我会提供更多帮助

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

a.rt1-AB  a.rt2-CD
注意:这与您问题中的示例不同

之后:

a.rt1-AB  a.rt2-CD

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

给您,所有内容都是bash,简短明了:

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

给你,所有的bash,简洁明了:

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

你是说
ABC.rt2
-->
ABC.rt2 CD
?(与
rt1
)相反。你的意思是
ABC.rt2
-->
ABC.rt2 CD
?(与rt1相反)。