¿Cómo cambiar el nombre de varios archivos eliminando la extensión?

14

Tengo varios archivos tiff llamados:

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

y quiero eliminar el .tifal final de cada uno de los archivos. ¿Cómo puedo usar el renamecomando para hacer esto?

Pablo
fuente
2
Tenga en cuenta que NINGÚN sistema de archivos de Linux o Unix utiliza "extensiones" de Windows o VMS - es solo por convención que un sufijo del nombre del archivo es ".tif" o ".c" o ".o" o ".so " o lo que sea.
Bruce Ediger
Eso está bien ... Estoy importando archivos de Windows a Linux :)
Paul
1
Técnicamente hablando, Windows tampoco usa extensiones de archivo, es solo que el administrador de archivos de Windows 95 siguió usando los últimos caracteres del nombre de archivo para determinar el tipo de archivo después de romper el esquema de nomenclatura de MS-DOS y la convención ha permanecido desde entonces.
RAKK

Respuestas:

24

perl's rename(como se encuentra típicamente en Debian donde también se llama prename), o este derivado ( renamepaquete en Debian):

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

util-linux rename(como se encuentra típicamente en Red Hat, rename.ulen Debian):

rename -- .tif '' *.tif

(tenga en cuenta que se cambiaría el nombre blah.tiffany.tifa blahfany.tif)

Ignacio Vazquez-Abrams
fuente
2
Creo que el cambio de nombre de "Debian" es de Larry Wall (¿viene con Perl?) Y "Red Hat" es de util-linux (rename.ul en Debian IIRC).
XTL
@XTL: Verdadero. Simplemente los llamo así porque son los programas de "cambio de nombre" que se encuentran en los derivados de Debian o Red Hat.
Ignacio Vazquez-Abrams
¡Muchas gracias! Nunca me di cuenta de que había diferentes versiones de 'renombrar'. Supongo que hay otras diferencias sutiles entre los comandos en debian y redhat. Tendré que buscar algunas de sus diferencias.
Paul
El segundo comando resultó sintaxis no válida, pero el primero funcionó.
HelloWorld
6

Para un cambio de nombre, puede hacer:

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

(-i para advertir contra la sustitución de un archivo)

XTL
fuente
15
Versión más segura y rápida:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013
+1 en el último comentario aquí. Es más seguro en nombres de archivos con espacios vacíos.
Petobens
1
@ jw013 su comentario debería ser una respuesta de alto nivel.
Roland
1
rename -- .oldext .newext *.oldext

Esto sustituye la antigua extensión por la nueva. Para eliminar simplemente la extensión, puede pasar explícitamente una cadena vacía como argumento.

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

Con el comando anterior, todos los archivos con .gz.tmpextensión en la carpeta actual serán renombrados filename.gz.

Consulte el artículo: Linux: elimine las extensiones de archivo para varios archivos para obtener más detalles.

Manpreet Singh
fuente
1
Eso supone que la implementación de util-linux renamees incompatible con (y mucho más limitada que) el renamecomando tradicional de perl.
Stéphane Chazelas
También tenga en cuenta que reemplaza la primera aparición .oldextdentro del nombre del archivo, no necesariamente la extensión ( foo.oldextasy.oldextsería renombrada como footasy.oldext).
Stéphane Chazelas
1

Si utiliza IBM AIX, no tendrá un renamecomando, por lo que para eliminar por lotes las extensiones de archivo tendrá que usar comandos UNIX de System V simples:

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

podemos hacer esto recursivo

for i in *.gz; do mv -i $i `basename $i .gz`; done
usuario3361573
fuente