4 votos

¿Cambiar en masa una porción del nombre de un archivo?

Tengo un montón de archivos con el siguiente nombre (ejemplo):

ADVANTE  18''8.0 PCD5'114.3 ET45 CB73.1.jpg
ADVANTE  18x8.0 PCD6139.7 ET20 CB110.2.jpg
ADVANTE 'A MI576B 20''8.5 PCD6'139.7 ET25 CB110.2 GBXZLDCP.jpg
ADVANTE 'A SH10 15''6.5 PCD8'100-114.3 ET40 CB73.1 3FPBU.jpg

¿Cómo puedo cambiar una parte del nombre de cada archivo a:

ADVANTI  18''8.0 PCD5'114.3 ET45 CB73.1.jpg
ADVANTI  18x8.0 PCD6139.7 ET20 CB110.2.jpg
ADVANTI 'A MI576B 20''8.5 PCD6'139.7 ET25 CB110.2 GBXZLDCP.jpg
ADVANTI 'A SH10 15''6.5 PCD8'100-114.3 ET40 CB73.1 3FPBU.jpg

¿usando algún tipo de comando o aplicación? Sería demasiado largo renombrar manualmente cada uno de ellos.

5voto

Scott Saad Puntos 247

Si usas la terminal ZSH, esto se puede hacer fácilmente en Terminal con zmv (incluido con OS X por defecto). ¿Por qué usar scripts complicados si el trabajo ya está hecho?

Escribe zsh en una ventana de terminal si por alguna extraña razón no lo tienes configurado como tu shell predeterminado.

autoload zmv
zmv 'ADVANTE(*)' 'ADVANTI$1'

0 votos

Ahora eso es una razón de primera categoría, excelente para iniciar zsh. :) +1

0 votos

Dice localhost% zmv 'ADVANTE(*)' 'ADVANTI$1' zsh: comando no encontrado: zmv

0 votos

@Propeller Disculpa por la respuesta tardía, me la perdí la primera vez. El error significa que o bien te has saltado la primera línea (autoload zmv), o no estás utilizando la instalación predeterminada de zsh.

2voto

200_success Puntos 319

A partir de OS X 10.10 (Yosemite), puedes usar el Finder para buscar y reemplazar cadenas en nombres de archivos. Selecciona los archivos que quieres renombrar, luego invoca la opción Renombrar.... Deberías ver un cuadro de diálogo con los campos Buscar: y Reemplazar con:.

0 votos

Esta es la mejor respuesta. Es una característica tan útil que no es muy conocida, y no necesita ninguna aplicación de terceros ni trucos de script sofisticados.

1voto

En caso de que necesites hacer esto a menudo (y con diferentes patrones de archivos), este script de perl puede resultar muy útil. Guarda el siguiente script como un archivo de texto llamado rename en un lugar conveniente:

#!/usr/bin/perl -w
# rename - Corrector de nombres de archivos de Larry
$op = shift or die "Uso: rename expr [files]\n";
chomp(@ARGV = ) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

Luego puedes usar todas las expresiones estándar de perl para renombrar archivos, en tu caso

rename 's/^ADVANTE/ADVANTI/' ADVANTE*

1 votos

Asegúrate de que el "lugar conveniente" esté en tu $PATH actual, y después de guardarlo debes hacer chmod 755 rename para hacerlo ejecutable.

0 votos

Sí, eso ayudaría en efecto :-)

1voto

Puedes probar la aplicación comercial A Better Finder Rename si quieres evitar utilizar el Terminal. También tienen una prueba gratuita.

[Descargo de responsabilidad: no tengo interés financiero en la empresa que vende ABFR, solo soy un cliente satisfecho.]

0voto

Leonard Puntos 2832

Puedes usar la terminal de la siguiente manera:

find . -type f -maxdepth 1 -print0 | while read -d $'\0' file; do mv "$file" "$( echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/" )" ; done
  • find se utiliza para listar todos los archivos que se van a renombrar
    • . es el directorio en el que se comienza la búsqueda
    • -type f especifica que solo se deben considerar archivos
    • -maxdepth 1 especifica que find no debe recursar en subdirectorios
    • -print0 imprime el nombre de archivo seguido de un carácter NUL ASCII (como tus nombres de archivo contienen espacios, necesitamos un carácter especial para separarlos: el espacio no se puede usar)
  • while read -d $'\0' file procesa los nombres de archivo producidos y los almacena en la variable $file
  • echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/" realiza la sustitución (ADVANTE con ADVANTI)
  • mv mueve el primer archivo (el nombre original) al segundo (el que tiene la sustitución)

Probado con:

$ ls -l
total 0
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTE  18''8.0 PCD5'114.3 ET45 CB73.1.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTE  18x8.0 PCD6139.7 ET20 CB110.2.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTE 'A MI576B 20''8.5 PCD6'139.7 ET25 CB110.2 GBXZLDCP.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:27 ADVANTE 'A SH10 15''6.5 PCD8'100-114.3 ET40 CB73.1 3FPBU.jpg
$ find . -type f -maxdepth 1 -print0 | while read -d $'\0' file; do mv "$file" "$( echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/" )" ; done
$ ls -l
total 0
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTI  18''8.0 PCD5'114.3 ET45 CB73.1.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTI  18x8.0 PCD6139.7 ET20 CB110.2.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:26 ADVANTI 'A MI576B 20''8.5 PCD6'139.7 ET25 CB110.2 GBXZLDCP.jpg
-rw-r--r--  1 corti  corti  0 Feb 27 10:27 ADVANTI 'A SH10 15''6.5 PCD8'100-114.3 ET40 CB73.1 3FPBU.jpg

2 votos

¿Hay alguna razón específica por la que utilices find -maxdepth 1 en lugar de un bucle for f in *?

2 votos

Sí, debido a los espacios: * se expandirá en una lista de tokens y el shell los separará en los espacios. Como la lista de archivos contiene espacios, el shell no podrá distinguir si el espacio forma parte del nombre o es un separador.

1 votos

En realidad, intenta touch "foo bar" foo; for i in f*; do echo $i; done

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X