J'ai une niveleuse pour COCI (un concours de programmation compétitif) qui lit les fichiers d'entrée (txt[number].in
), compile et exécute un code (txt.cpp
) et fait correspondre le résultat à un fichier de sortie (txt[number].out
) Le problème est que les fichiers d'entrée du problème COCI ont un format (txt.in.1
), (txt.in.2
), (txt.in.3
), etc., ainsi que des noms similaires pour les fichiers de sortie.
Je dois changer les extensions des fichiers d'entrée de txt.in.[number]
à txt[number].in
. (Nécessité de faire la même chose pour les fichiers de sortie également)
Est-ce que quelqu'un peut m'aider avec ça?
J'utilise actuellement 13.04 Ubuntu.
En utilisant le terminal, je pense que c'est le moyen le plus simple:
_mmv -v "*.in.*" "#1#2.in"
_
Voici un test:
_$ 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
_
Par défaut, mmv
n'est pas installé dans Ubuntu, mais vous pouvez l'installer à partir d'un terminal à l'aide de la commande suivante:
_Sudo apt-get install mmv
_
Voir man mmv
pour plus d'informations.
S'il est correct qu'un file.in.1
devienne file.in.1.in
, alors cela suffira
rename 's/$/.in/' *
Si vous pensez que les deux en sont laids, alors faites
rename 's/\.in(\.\d+)$/$1.in/' *
Passez l’option -n
pour effectuer un essai à blanc.
Ce script va copier tous les fichiers du répertoire de travail, qui correspondent à * .in. *
#!/bin/bash
for i in $(ls *.in.*)
do
target=$(echo ${i} | awk -F'.' '{ print $1$3"."$2 }')
cp ${i} ${target}
done
Une version utilisant rename
qui fonctionne pour votre format révisé serait
rename -- 's/(\.in|\.out)\.(\d+)/$2$1/' *
par exemple.
$ 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