Come cambio le estensioni di tutti i file in una cartella in un'estensione comune quando tutti i file hanno estensioni diverse?

2

Ho un classificatore per COCI (un contest di programmazione competitivo) che legge i file di input ( txt[number].in ), compila ed esegue un codice ( txt.cpp ) e corrisponde al risultato con un file di output ( txt[number].out ). Il problema è che i file di input del problema COCI hanno formato ( txt.in.1 ), ( txt.in.2 ), ( txt.in.3 ) ecc. E nomi simili per i file di output.

Devo modificare le estensioni dei file di input da txt.in.[number] a txt[number].in . (È necessario fare lo stesso anche per i file di output)

Qualcuno può aiutarmi con questo?

Attualmente sto utilizzando la versione 13.04 di Ubuntu.

    
posta Labib666 04.10.2013 - 13:14

4 risposte

3

Usando il terminale, penso che questo sia il modo più semplice:

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

Ecco 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

Per impostazione predefinita, mmv non è installato in Ubuntu, ma puoi installarlo dal terminale usando il seguente comando:

sudo apt-get install mmv

Vedi man mmv per ulteriori informazioni.

    
risposta data Radu Rădeanu 04.10.2013 - 13:41
2

Se va bene che un file.in.1 diventa file.in.1.in , allora lo farà

rename 's/$/.in/' *

Se pensi che i due in siano brutti, allora fai

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

Passa l'opzione -n per eseguire un ciclo di prova.

    
risposta data zwets 04.10.2013 - 14:23
0

Questo script copia tutti i file nella directory di lavoro, che corrispondono a * .in. *

#!/bin/bash
for i in $(ls *.in.*)
do
    target=$(echo ${i} | awk -F'.' '{ print "." }')
    cp ${i} ${target}
done
    
risposta data Seamus Boyle 11.10.2013 - 09:14
0

Una versione che utilizza rename che funziona per il tuo formato rivisto sarebbe

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

per es.

$ 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+)//' *
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
    
risposta data steeldriver 11.10.2013 - 14:41

Leggi altre domande sui tag