For loop 将连续数字追加到文件名

For loop 将连续数字追加到文件名,for-loop,awk,sed,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"

我有一个文件列表,比如

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

这应该可以做到:

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是filename,不带扩展名。

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

任一

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

$ 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

$ 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

$ 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

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

awk '{split($0,a,"."); print a[1]"."NR"."a[2]}' file
file是包含以下值的输入文件

Ortho234.phy
Ortho671.phy
Ortho880.phy

i
是您的文件名,您没有使用它。我个人认为您有xy问题,因为重命名这些文件并没有带来任何好处,最好向您的实际数组问题寻求帮助。文件的顺序仍然与添加新编号之前的顺序相同。我选择2号门!(可移植性++)。。。如果你取消这个选项,我会投赞成票。:-)也可以使用
rename's/\./“++$a.”/e'*.phy
rename'$a++;s/\./“$a.”/e'*.phy
,利用@Sundeep:感谢您的建议刚刚意识到第二个建议不需要
e
rename'$a++;s/\./.$a./'*.phy
e代表表达式s/\./.++$a.“/e”的什么意思?如果我没有弄错的话,“++$a前后”是perl的字符串连接运算符?awk可以读取输入文件本身,无需使用cat输入文件| awk。。。。那就指挥吧。它通常被称为UOOC(无用的cat命令使用)。