web-dev-qa-db-fra.com

Comment modifier les extensions de tous les fichiers d'un dossier en une extension commune lorsque tous les fichiers ont des extensions différentes?

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.

3
Labib666

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.

3
Radu Rădeanu

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.

2
zwets

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
0
Seamus Boyle

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
0
steeldriver