Come rinominare più file rimuovendo l'estensione?


14

Ho un numero di file tiff chiamati:

sw.001.tif
sw.002.tif
...

e voglio rimuovere il .tifalla fine di ciascuno dei file. Come posso usare il renamecomando per fare questo?


2
Ricorda che NESSUN filesystem linux o unix usa "estensioni" in stile Windows o VMS - è solo per convenzione che un suffisso del nome del file è ".tif" o ".c" o ".o" o ".so "o qualunque altra cosa.
Bruce Ediger,

Va bene ... Sto importando file da Windows a Linux :)
Paul

1
Tecnicamente parlando Windows non usa neanche le estensioni di file, è solo che il file manager di Windows 95 ha continuato a usare gli ultimi caratteri del nome file per determinare il tipo di file dopo aver rotto lo schema di denominazione MS-DOS e da allora la convenzione è rimasta.
RAKK,

Risposte:


24

perl's rename(come in genere si trova su Debian dove viene anche chiamato prename), o questa derivata ( renamepacchetto su Debian):

rename 's/\.tif$//' *.tif

util-linux rename(come generalmente si trova su Red Hat, rename.ulsu Debian):

rename -- .tif '' *.tif

(nota che quello sarebbe rinomina blah.tiffany.tifa blahfany.tif)


2
Credo che il nome "Debian" sia di Larry Wall (viene fornito con Perl?) E "Red Hat" sia da util-linux (rename.ul in Debian IIRC).
XTL

@XTL: True. Li chiamo solo perché sono i programmi di "rinomina" che si trovano nei derivati ​​Debian o Red Hat.
Ignacio Vazquez-Abrams,

Grazie mille! Non ho mai capito che c'erano diverse versioni di "rinomina". Presumo ci siano altre sottili differenze tra i comandi in debian e redhat. Dovrò cercare alcune delle loro differenze.
Paul

Il secondo comando ha prodotto una sintassi non valida, ma il primo ha funzionato.
HelloWorld

6

Per un non rinominare, potresti fare:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i per mettere in guardia contro la sostituzione di un file)


15
Versione più veloce e sicura:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013,

+1 sull'ultimo commento qui. È più sicuro sui nomi di file con spazi vuoti.
petobens

1
@ jw013 il tuo commento dovrebbe essere una risposta di alto livello.
Roland

1
rename -- .oldext .newext *.oldext

Questo sostituisce la vecchia estensione con quella nuova. Per rimuovere semplicemente l'estensione è possibile passare esplicitamente una stringa vuota come argomento.

rename -- .gz.tmp  '' *.gz.tmp

Con il comando precedente tutti i file con .gz.tmpestensione nella cartella corrente verranno rinominati filename.gz.

Fare riferimento all'articolo: Linux: rimuovere le estensioni di file per più file per i dettagli.


1
Ciò presuppone che l'implementazione util-linux renamesia incompatibile con (e molto più limitata di) il renamecomando tradizionale da perl.
Stéphane Chazelas,

Si noti inoltre che sostituisce la prima occorrenza .oldextall'interno del nome del file, non necessariamente l'estensione ( foo.oldextasy.oldextverrebbe rinominata in footasy.oldext).
Stéphane Chazelas,

1

Se usi IBM AIX non avrai un renamecomando, quindi per rimuovere in batch le estensioni dei file dovrai usare semplici comandi UNIX System V vanilla:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;

-2

possiamo renderlo ricorsivo

for i in *.gz; do mv -i $i `basename $i .gz`; done
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.