¿Cambia en masa una parte del nombre de un archivo?

4

Tengo un montón de archivos nombrados de la siguiente manera (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 ir a cada archivo y cambiar una parte de su nombre de archivo para:

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

utilizando algún tipo de comando o aplicación? Tomaría demasiado tiempo cambiar el nombre de cada uno de ellos manualmente.

    
pregunta Propeller 27.02.2013 - 09:36

5 respuestas

5

Si usa el shell ZSH, esto puede hacerse fácilmente en la Terminal con zmv (incluido with OS X de forma predeterminada). ¿Por qué usar scripts de fantasía si el trabajo ya está hecho?

Escriba zsh en una ventana de terminal si, por alguna loca razón, no lo tiene configurado como su shell predeterminado.

autoload zmv
zmv 'ADVANTE(*)' 'ADVANTI$1'
    
respondido por el ghoppe 27.02.2013 - 16:58
1

En caso de que necesite hacer esto a menudo (y con diferentes patrones de archivo), esta secuencia de comandos de Perl rename en un lugar conveniente:

#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
    $was = $_;
    eval $op;
    die $@ if $@;
    rename($was,$_) unless $was eq $_;
}

Luego puede usar todas las expresiones estándar de Perl para cambiar el nombre de los archivos, en su caso

rename 's/^ADVANTE/ADVANTI/' ADVANTE*
    
respondido por el nohillside 27.02.2013 - 11:19
1

Puede probar la aplicación comercial A Better Finder Rename si desea evitar la Terminal. También tienen una versión de prueba gratuita.

[Descargo de responsabilidad: no hay intereses financieros en la empresa que vende ABFR, solo un cliente satisfecho.]

    
respondido por el IconDaemon 27.02.2013 - 15:22
1

A partir de OS X 10.10 (Yosemite), puede usar el Finder para buscar y reemplazar cadenas en los nombres de archivo. Seleccione los archivos cuyo nombre desea cambiar, luego invoque la opción Rename… . Debería ver una hoja de diálogo con los campos Find: y Replace with: .

    
respondido por el 200_success 16.10.2014 - 23:21
0

Puede utilizar el terminal de la siguiente manera:

find . -type f -maxdepth 1 -print0 | while read -d $'
$ 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 $'
find . -type f -maxdepth 1 -print0 | while read -d $'
$ 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 $'%pre%' 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
' file; do mv "$file" "$( echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/" )" ; done
' 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
' file; do mv "$file" "$( echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/" )" ; done
  • find se usa para enumerar todos los archivos a los que se va a renombrar
    • . es el directorio donde se inicia la búsqueda
    • -type f especifica que solo los archivos deben ser considerados
    • -maxdepth 1 especificó que la búsqueda no debería repetirse en los subdirectorios
    • -print0 imprime el nombre del archivo seguido de un carácter ASCII NUL (ya que los nombres de los archivos contienen espacios, necesitamos un carácter especial para separarlos: no se puede usar el espacio)
  • while read -d $'$file' file procesa los nombres de archivo producidos y los almacena en la variable echo "$file" | sed "s/\.\/ADVANTE/ADVANTI/"
  • mv realiza la sustitución (ADVANTE con ADVANTI)
  • %code% mueve el primer archivo (el nombre original) al segundo (el que tiene la sustitución)

Probado con:

%pre%     
respondido por el Matteo 27.02.2013 - 10:41

Lea otras preguntas en las etiquetas