Cambia in modo ricorsivo le estensioni dei file in Bash


87

Voglio iterare ricorsivamente attraverso una directory e cambiare l'estensione di tutti i file di una certa estensione, diciamo .t1a .t2. Qual è il comando bash per eseguire questa operazione?


14
imho questa non è una domanda duplicata - l'altra domanda non è ricorsiva
utente linux shonky


@AmalAntony: Se non lo hai rename, scrivi uno script di shell, che rinomina un singolo file (banale da fare nel tuo semplice caso), e poi usa findper applicare questo script a tutti i file con l'estensione offensiva.
user1934428

Risposte:


208

Se hai rinominato disponibile, usa:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

o altro:

find . -name '*.t1' -exec rename .t1 .t2 {} +

Se rinomina non è disponibile, usa:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
Aaron Blenkush

2
(La mia versione di renamenon consente l'espressione di sostituzione in stile sed. Devo amare Linux. Dovevo installare TotalCommander per Windows per fare cose del genere.)
Aaron Blenkush

6
Nel caso qualcuno si chieda cosa fa la "${1%.t1}".t2parte, come ho fatto io: usa la manipolazione della stringa bash per fare quanto segue: 1 / Prendi il primo parametro posizionale $1e tronca la .t1stringa letterale dalla sua fine ( %operatore del segno di percentuale ). 2 / Aggiunge la .t2stringa letterale al risultato.
Zack

2
La ridenominazione non ha funzionato per me in OSX, ma la versione bash è fantastica b / c Ho appena aggiunto "git" davanti a mv e ora git è felice :-D
bdombro

3
preferisce l'utente find . -type f -name '*.t1'per evitare le cartelle
Golak Sarangi

9

Se la tua versione di bashsupporta l' globstaropzione (versione 4 o successiva):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

7

Oppure puoi semplicemente installare il mmvcomando e fare:

mmv '*.t1' '#1.t2'

Ecco #1la prima parte glob, ovvero il file *in *.t1.

O in pura roba bash, un modo semplice sarebbe:

for f in *.t1; do
    mv "$f" "${f%.t1}.t2"
done

(cioè: forpuò elencare i file senza l'aiuto di un comando esterno come lso find)

HTH


7
Presumo che l'uso dell'OP di "ricorsivamente" si riferisca anche alla ridenominazione dei file nelle sottodirectory della directory.
chepner

1
è la prima parte di glob, vale a dire l' *in*.t1
zmo

6

Lo farei in questo modo in bash:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

EDIT: errore mio: non è ricorsivo, ecco il mio modo per cambiare il nome del file ricorsivo:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

8
Non analizzare ls e vedi la stessa pagina per il motivo per cui la tua findsintassi è cattiva. Inoltre, assicurati di citare le tue variabili
Reinstate Monica Please
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.