Как изменить расширения всех файлов в папке на одно общее расширение, если все файлы имеют разные расширения?

У меня есть грейдер для 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.

3
задан 11 October 2013 в 10:38

4 ответа

Используя терминал, я думаю, что это самый простой способ:

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

По умолчанию, mmv не установлен в Ubuntu, но вы можете установить его из терминала, используя следующую команду:

sudo apt-get install mmv

См. man mmv для получения дополнительной информации.

0
ответ дан 11 October 2013 в 10:38

Если все в порядке, что file.in.1 становится file.in.1.in, то это будет делать

rename 's/$/.in/' *

Если вы считаете, что два в уродливы, тогда сделайте [ 117]

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

Передайте опцию -n, чтобы выполнить пробный прогон.

0
ответ дан 11 October 2013 в 10:38

Версия с использованием 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
0
ответ дан 11 October 2013 в 10:38

Этот скрипт скопирует все файлы в рабочем каталоге, которые соответствуют * .in. *

#!/bin/bash
for i in $(ls *.in.*)
do
    target=$(echo ${i} | awk -F'.' '{ print $1$3"."$2 }')
    cp ${i} ${target}
done
0
ответ дан 11 October 2013 в 10:38

Другие вопросы по тегам:

Похожие вопросы: