У меня есть грейдер для 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.
Используя терминал, я думаю, что это самый простой способ:
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
для получения дополнительной информации.
Если все в порядке, что file.in.1
становится file.in.1.in
, то это будет делать
rename 's/$/.in/' *
Если вы считаете, что два в уродливы, тогда сделайте [ 117]
rename 's/\.in(\.\d+)$/$1.in/' *
Передайте опцию -n
, чтобы выполнить пробный прогон.
Версия с использованием 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
Этот скрипт скопирует все файлы в рабочем каталоге, которые соответствуют * .in. *
#!/bin/bash
for i in $(ls *.in.*)
do
target=$(echo ${i} | awk -F'.' '{ print $1$3"."$2 }')
cp ${i} ${target}
done