将连续数字附加到文件名

时间:2017-02-17 20:54:35

标签: for-loop awk sed

我有一个像

这样的文件列表
Ortho234.phy
Ortho671.phy
Ortho880.phy and so on

我想将它们重命名为数组作业

Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

我尝试了这个但是这个替换并将文件命名为1.phy,2.phy等等。

 a=1
 for i in *.phy; do
     new=$(printf "%04d.phy" "$a") 
     mv -- "$i" "$new"
     let a=a+1
 done

4 个答案:

答案 0 :(得分:5)

以下命令中的任何一个都可以完成您的工作

c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy  

rename 's/\./".".++$a."."/e' *.phy                  

rename '$a++; s/\./.$a./e' *.phy                   

n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done

<强>要么

  

它执行perl s///表达式,并从中执行重命名   原来的替换字符串。在我使用的替换字符串中   sprintf格式化名称,我使用环境变量c作为   柜台

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy  
Ortho671.phy  
Ortho880.phy

$ n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done

$ ls *.phy -1
Ortho234.1.phy  
Ortho671.2.phy  
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ rename 's/\./".".++$a."."/e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

$ touch Ortho234.phy  Ortho671.phy  Ortho880.phy

$ ls *.phy -1
Ortho234.phy
Ortho671.phy
Ortho880.phy

$ rename '$a++; s/\./.$a./e' *.phy

$ ls *.phy -1
Ortho234.1.phy
Ortho671.2.phy
Ortho880.3.phy

答案 1 :(得分:1)

这应该做的工作:

a=1
for i in *.phy; do
filepart=$(echo $i | sed 's/.phy//g')
new=$(printf "%s.%d.phy" "$filepart" "$a")
mv -- "$i" "$new"
let a=a+1
done

filepart是文件名,没有扩展名。

答案 2 :(得分:1)

int i = 0;
while (i<1)
{
    //event
}

答案 3 :(得分:1)

awk命令也有助于获得所需的输出。 NR给出行号并在.上拆分输入,并根据需要重写数组,如下所示

awk '{split($0,a,"."); print a[1]"."NR"."a[2]}' file

文件是包含以下值的输入文件

Ortho234.phy
Ortho671.phy
Ortho880.phy