Rinomina un gruppo di file con un comando


38

Se ho un gruppo di file con estensione .htm, come posso rinominarli tutti in .html?

mv *.htm *.html

non funziona.


Solo per completezza, ren *.htm *.htmlfunzionerà in Windows.
Brian Burns,

Risposte:


50

Oppure, potresti usare pure bash ... (eccetto per mv, cioè ..)

for file in *.htm; do mv "$file" "${file%.htm}.html"; done

ed evita le brutte cose del nome di base. ;)

Bash ha una vasta gamma di opzioni di espansione variabili. Quello qui usato, '%', rimuove il suffisso di corrispondenza più piccolo dal valore della variabile. Il modello è un modello glob, quindi ${file%.*}funzionerebbe anche. L'operatore '%%' rimuove il suffisso di corrispondenza più grande ed è intercambiabile nell'esempio sopra, poiché lo schema è fisso, ${file%%.*}.htmltrasformerebbe abhtm in a.html.

Vedi la sezione delle sottostazioni variabili della manpage di bash per ulteriori trucchi. C'è molto che può essere fatto direttamente all'interno di bash.


1
Si noti inoltre che queste espansioni di parametri non si limitano a bash . Sono disponibili su tutte le shell derivate da Bourne ( sh , ksh , bash , zsh , dash , ash , ecc.). Le espansioni fanno parte delle specifiche POSIX per "Shell Command Language" e sono altamente portatili.
Chris Johnsen,

11

Non ci dovrebbero essere spazi, newline o altri spazi bianchi nei nomi dei file, ma questa versione della risposta di Freiheit li gestisce. Utilizza anche al $()posto dei backtick per la leggibilità insieme ad altri vantaggi.

for file in *.htm
do
    mv "$file" "$(basename "$file" .htm).html"
done

Ancora meglio - per il caso speciale di aggiungere solo alla fine:

for file in *.htm
do
    mv "$file" "${file}l"
done

11

rename(1)è un'utilità Perl che fa esattamente quello che vuoi. In questo caso:

rename 's/\.htm$/.html/' *htm

o se stai usando anche sottodirectory

(richiede Bash 4.0 e l'impostazione globstar: shopt -s globstar)

rename 's/\.htm$/.html/' **/*htm


1
rinominare è più semplice, ma non è un programma unix standard; la domanda originale non specifica quale unix. Sembra essere "nome" in alcuni punti.
Freiheit,

2
renameviene fornito con perl, e praticamente ogni unix viene fornito con perl in questi giorni.
TRS-80,

3
sì, ma non tutti gli unix includono programmi ausiliari come 'rinomina' quando inseriscono perl nel sistema. OSX, ad esempio, non ha "rinominare" su di esso.
Freiheit,

1
@William: la sintassi del doppio asterisco è disponibile solo in Bash 4 e versioni successive e solo se è attivata con shopt -s globstar(disattivata per impostazione predefinita). Inoltre, Linux e Unix hanno directory anziché cartelle.
In pausa fino a nuovo avviso.

6
for file in *.htm; do
  mv $file `basename "$file" .htm`.html
done

Provalo con un echodavanti alla mvprima volta.

Il problema con l'originale è che " mv *.htm *.html" ha la *s gestita dalla shell, quindi il mvcomando vede semplicemente un elenco di tutti i file .htm e .html nella directory corrente. In altre parole, qualcosa come " mv foo.htm bar.htm stuff.htm six.htm file.htm". mv sa come gestire più di 2 argomenti solo se l'ultimo è una directory.


1
Dovresti citare "$ file", per gestire gli spazi.
Richard Hoskins,

La tua descrizione del problema originale dovrebbe essere enfatizzata più fortemente. Questo comportamento di espansione dei caratteri jolly della shell è sorprendente e non intuitivo per qualcuno proveniente da Windows Land e capire cosa fa la shell chiarisce perché l'applicazione originale di mvnon funzionerà.
Greg Hewgill,

3

Ancora un altro puro esempio di bash che usa string stringa.

for file in *.htm; do mv $file ${file/htm/html}; done

Extra: sostituisce tutte le occorrenze di una stringa

for file in *.htm; do mv $file ${file//htm/html}; done



0

Il pacchetto util-linux-ng (su Fedora) ha un renamecomando simile a quello menzionato da TRS-80 . Puoi usarlo in questo modo:

rename .htm .html *.html
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.