it-swarm.it

Come posso modificare l'estensione di più file?

Vorrei cambiare un'estensione di file da *.txt per *.text. Ho provato ad usare il comando basename, ma ho problemi a cambiare più di un file.

Ecco il mio codice:

files=`ls -1 *.txt`

for x in $files
do
    mv $x "`basename $files .txt`.text"
done

Ricevo questo errore:

basename: too many arguments Try basename --help' for more information
192
afbr1201

Direttamente da Greg's Wiki :

 # Rinomina tutto * .txt in * .text 
 Per f in * .txt; do 
 mv - "$ f" "$ {f% .txt} .text" 
 fatto 

Vedi anche la voce sul perché non dovresti analizzare ls .

Modifica: se devi usare basename, la tua sintassi sarebbe:

 per f in * .txt; do 
 mv - "$ f" "$ (basename -" $ f ".txt) .text" 
 done 
211
jasonwryan

Ecco come cambio tutte le estensioni dei file nella directory corrente su Debian.

rename "s/oldExtension/newExtension/" *.txt

(Questo è il comando Perl rename, non il util-linux uno. Vedi Perché l'utilità di rinomina su Debian/Ubuntu è diversa da quella su altre distribuzioni, come CentOS? )

157
Matthias Braun

Un semplice comando, il rename da util-linux , lo farà per te, sostituendo tutte le occorrenze di "txt" a "testo" in tutti i file corrispondenti "* .txt":

rename txt text *.txt
43
lamwaiman1988
rename "s/oldExtension/newExtension/" *.txt

Sopra funziona bene ma si limita alla directory corrente. Prova il comando seguente, che è flessibile con le sottodirectory. Rinominerà tutto .txt file nella struttura di directory con una nuova estensione.

find . -name "*.txt" -exec rename 's/.txt$/.newext/' {} \;
31
Rahul

Le risposte qui facendo riferimento a s/oldExtension/newExtension/ hanno torto. Se usi s/txt/text/, convertiresti footxt.txt per footext.txt, che non è quello che desideri. Anche se usi s/.txt/.text/, che convertirà footxt.txt per fo.text.txt.

Devi usare \. per abbinare il periodo (. corrisponderà a qualsiasi carattere). E il finale $ per abbinare la fine della riga. Solo questo corrisponderà correttamente all'estensione.

rename 's/\.txt$/.text/' *.txt

rename 's/\.old$/.new/' *.old
12
wisbucky
for f in *.txt
do
    [ -f "$f" ] && mv "$f" "${f%txt}text"
done
9

Basato sulla risposta di @Prince John Wesley, ecco un semplice script bash per modificare tutte le estensioni dei file nella directory corrente da ext1 per ext2. Emette anche i nomi dei file che vengono rinominati.

#!/bin/bash
for f in *.$1
do
    [ -f "$f" ] && mv -v "$f" "${f%$1}$2"
done

Esempio di utilizzo (supponendo che il nome dello script sia change-ext):

change-ext ext1 ext2
8

Motivo # 53 per passare a zsh:

zmv '(*).txt' '$1.text'

7
Burrito

diciamo che i tuoi file sono sparsi in varie directory, supponendo che dirx sia la tua directory principale, questo può fare il lavoro usando find:

for f in `find /dirx -iname '*.txt' -type f -print`;do  mv "$f" ${f%.txt}.text; done
6
Arash

Questo è ciò che funziona per me:

find . -name '*.txt' -exec rename 's/\.txt$/.text/' \{} \;
2
yegor256

Quando tu

non ha un'estensione per i file di origine

e l'estensione di destinazione è . text lo faresti in questo modo -

for f in *; do mv -- "$f" "${f%.\*}.text"; done
2
nitinr708

Se vuoi sapere cosa è andato storto nella tua versione: hai usato $files invece di $x nel comando basename. Quindi dovrebbe funzionare (non testato):

for x in *.txt
do
  mv "$x" "`basename '$x' .txt`.text"
done
1
daniel kullmann