当所有文件的扩展名都不同时,如何将文件夹中所有文件的扩展名更改为一个通用扩展名?

当所有文件的扩展名都不同时,如何将文件夹中所有文件的扩展名更改为一个通用扩展名?

我有一个 COCI(一项竞争性编程竞赛)的评分器,它读取输入文件(txt[number].in),编译并运行代码(txt.cpp),并将结果与​​输出文件(txt[number].out)进行匹配。问题是,COCI 问题的输入文件具有格式(txt.in.1)、(txt.in.2)、(txt.in.3)等,并且输出文件的名称也类似。

我需要将输入文件的扩展名从 更改为txt.in.[number]txt[number].in(需要对输出文件执行相同的操作)

谁能帮我这个?

我目前正在使用 13.04 Ubuntu。

答案1

使用终端,我认为这是最简单的方法:

mmv -v "*.in.*" "#1#2.in"

这是一个测试:

$ ls
txt.in.1  txt.in.2  txt.in.3
$ mmv -v "*.in.*" "#1#2.in"
txt.in.1 -> txt1.in : done
txt.in.2 -> txt2.in : done
txt.in.3 -> txt3.in : done
$ ls
txt1.in  txt2.in  txt3.in

默认情况下,mmvUbuntu 中未安装,但您可以使用以下命令从终端安装它:

sudo apt-get install mmv

man mmv了解更多信息。

答案2

如果 afile.in.1变成file.in.1.in,那么这样就可以了

rename 's/$/.in/' *

如果你认为两者很丑,那就做

rename 's/\.in(\.\d+)$/$1.in/' *

通过-n选项来执行试运行。

答案3

该脚本将复制工作目录中与 *.in.* 匹配的所有文件

#!/bin/bash
for i in $(ls *.in.*)
do
    target=$(echo ${i} | awk -F'.' '{ print $1$3"."$2 }')
    cp ${i} ${target}
done

答案4

适用于您修订格式的版本rename将是

rename -- 's/(\.in|\.out)\.(\d+)/$2$1/' *

例如

$ ls
txt.in.1  txt.in.2  txt.in.3  txt.out.1  txt.out.2  txt.out.3
$
$ rename -nv -- 's/(\.in|\.out)\.(\d+)/$2$1/' *
txt.in.1 renamed as txt1.in
txt.in.2 renamed as txt2.in
txt.in.3 renamed as txt3.in
txt.out.1 renamed as txt1.out
txt.out.2 renamed as txt2.out
txt.out.3 renamed as txt3.out

相关内容