Cambiar el nombre de los archivos por lotes

151

Tengo un directorio lleno de imágenes:

image0001.png
image0002.png
image0003.png
...

Y me gustaría que una línea les cambie el nombre a (digamos).

0001.png
0002.png
0003.png
...

¿Cómo hago esto?

Hombre de internet
fuente
8
Esta es una de las preguntas más frecuentes sobre la línea de comandos de Unix, y no la puedo encontrar en este sitio, así que ¿deberíamos hacer esta Wiki de la comunidad?
Gilles
55
No veo porque. Es una pregunta específica con una respuesta verificable.
Hombre de Internet
3
Si está ejecutando X, no es mucho más fácil que thunar -B *.pngpara la herramienta gui de cambio de nombre masivo de thunar.
dotjoe
@dotjoe Gracias, Thunar es realmente interesante.
Volker Siegel

Respuestas:

106

Si está utilizando Bash u otro shell compatible con POSIX:

for f in *.png; do
    mv -- "$f" "${f#image}"
done
W_Whalley
fuente
2
Este es uno de los métodos de sustitución de parámetros que se muestran en la guía avanzada de secuencias de comandos de Mendel Coopers tldp.org/LDP/abs/html
W_Whalley
2
@W_Whalley Recomiendo encarecidamente evitar esa guía, a favor de la Guía Wooledge Bash .
Comodín el
@Wildcard: ¿cuáles son sus razones para recomendar evitar la guía de ABS?
Christian Severin
@ChristianSeverin promoción de malas prácticas y código rotundo. Verifique los enlaces en mi página de perfil.
Comodín
Si no sabe cómo adaptar este ejemplo para diferentes patrones de archivos, puede consultar la Sección de expansión de parámetros de la guía mencionada anteriormente.
lex82
108

En Debian y derivados, Perl's renamefunciona de manera similar a sedesto:

  rename -v 's/image//' *.png

También está el renamede util-linuxque funciona así, en su lugar:

  rename image '' *.png
Hombre de internet
fuente
66
realmente debería explicar que este es un programa perl que podría tener que instalarse y que toma expresiones regulares como argumento.
Ah, no estaba al tanto de eso. Daré crédito a la respuesta canónica, cuando la identifique :)
Hombre de Internet
55
Este renameprograma proviene de una distribución de ejemplos de Perl. Debian y Ubuntu lo envían como /usr/bin/rename. Es posible que otras variantes de Unix no lo proporcionen, o pueden proporcionar una completamente diferente /usr/bin/rename.
Gilles
1
Algunas versiones de renametomar una de al patrón de sustitución:rename [options] <expression> <replacement> <file>...
se funde
1
Si está utilizando un sistema basado en Debian, entonces sudo apt-get install rename, entonces puede usar el comando rename. Es sed para nombres de archivo.
ctrl-alt-delor
41

zmv

El shell zsh tiene un poderoso comando de cambio de nombre por lotes llamado zmv.

Primero debe habilitar el zmvcomando de la siguiente manera (esto puede ir a su ~/.zshrc).

autoload zmv

La sintaxis básica es zmv PATTERN REPLACEMENT. El patrón es una expresión glob shell. Las partes del patrón pueden estar rodeadas de paréntesis. El texto de sustitución puede contener $1, $2, etc., para referirse al grupo parenthesised N-ésimo en el patrón. Por ejemplo:

zmv 'image(*.png)' '$1'

También puede pedir a zsh para definir de forma automática $1, $2, etc, para que coincida con los caracteres comodín en el patrón:

zmv -w 'image*.png' '$1.png'
Gilles
fuente
44
sweeeeeeeeeeeeeeeeeet. otra razón por la que debería estar aprendiendo zsh.
ixtmixilix
1
@ixtmixilix ¿qué hay que aprender? Simplemente comience a usarlo y quizás agregue prezto ( github.com/sorin-ionescu/prezto ) para obtener algo más de asombro.
Gerry
Realmente genial, como se señaló en el hombre de zmv, esto se puede simplificar aún más agregando alias mmv = 'noglob zmv -W' a: mmv * .c.orig orig / *. C
Bretsko
Habilitar zmvprezto requiere descomentar la línea en su ~ / .zpreztorc después de # Set the Zsh functions to load (man zshcontrib).darzstyle ':prezto:load' zfunction 'zargs' 'zmv'
33

Normalmente uso la agradable y sencilla utilidad mmv ( página man ) para este caso de uso:

$ mmv "image*.png" "#1.png"

realizará tu tarea.

El #1patrón en el destino se sustituirá por el que coincida con el comodín en el patrón de origen. Esto también funciona para varios comodines y puede usarse, por ejemplo, para cambiar el orden de las partes de los nombres de archivo. También puede hacer fácilmente cosas más complicadas, como convertir letras minúsculas a mayúsculas.

Asegúrese de proteger los patrones del caparazón citando.

Marcel Stimberg
fuente
Gracias por señalar esta utilidad. Lo encontré en los repositorios de Debian, Ubuntu y Cygwin. Tuve problemas con la página de manual, pero encontré algunas páginas web y esta pregunta de desbordamiento de pila que ayudó a explicar cómo la estaba usando. stackoverflow.com/questions/417916/how-to-do-a-mass-rename
W_Whalley
Gracias, agregué más información a la respuesta para aclararla.
Marcel Stimberg
3
¡No puedo votarlo lo suficiente! Es muy simple y amigable. Disponible para OS X en homebrew.
Greg Dubicki
9

POSIX sh para bucle

Utiliza sed para renombrar

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
X Tian
fuente
6

Perl me gusta así que:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'

También puede usar el mismo patrón para otras tareas como copiar los archivos a otro directorio:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
gvkv
fuente
2
O (¡más seguro!):rename($old,$_)
reinierpost el
5

qmv

El comando qmvde renameutilsabre un editor que muestra una lista de nombres de archivo con dos columnas, separadas por una pestaña. Cada fila muestra uno de los nombres de archivo, el mismo en ambas columnas. La columna de la derecha representa los nuevos nombres de los archivos.
Para realizar cambios, edite los nombres en el lado derecho. En este ejemplo, :%s/...o el modo de bloqueo visual son útiles.

Nombres de archivo en su editor

$ qmv *.png

En editor:

image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

Editar nombres en la columna derecha:
(Eliminar el imageprefijo de todas las líneas usando el modo de bloque visual)

image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

Registro de cambio de nombre:

image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png

(por ejemplo Ubuntu: apt-get install renameutils)

Volker Siegel
fuente
3

recursivo

archivos de imagen * png de selección recurrente fácil, y supone que no es necesario tratar con nueva línea en los nombres de archivo

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done

Seguro, puede lidiar con espacios, nuevas líneas, barras invertidas y cualquier otra cosa :

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done
X Tian
fuente
1

POSIX sh usando un ciclo while

Lectura de nombres desde el findcomando.

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done

Leer nombres de un archivo

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
X Tian
fuente
1

Para Windows y Linux , este script Perl servirá; en este caso:

$ rnm -l 's/^image//' '*.png'

El script podría ejecutarse recursivamente bajo directorios e incluso anteponer un recuento a todos ellos:

$ rnm -r 's/^/$counter./' '/\.png$/'

Los caracteres UTF-8 también se tratan correctamente, tanto en Windows como en Linux.

circulosmeos
fuente
0

Puede usar esta herramienta: rnm ( página web )

Para su caso, el comando sería:

rnm -rs '/^image//' *.png

Puedes encontrar más ejemplos / documentos aquí .

Jahid
fuente
0

Pruebe brename ( https://github.com/shenwei356/brename ), una práctica herramienta de línea de comandos multiplataforma para cambiar el nombre de archivos / directorios de forma segura por lotes a través de expresiones regulares (compatible con Windows, Linux y OS X).

@patrickDurusau dijo:

Linux tiene una variedad de opciones de cambio de nombre de archivos por lotes, pero no vi ninguna deficiencia en brename que me llamó la atención.

caracteristicas:

  • Multiplataforma . Compatible con Windows, Mac OS X y Linux.
  • Seguro . Al verificar posibles conflictos y errores .
  • Filtrado de archivos . Apoyo a la inclusión y exclusión de archivos a través de expresiones regulares. No es necesario ejecutar comandos como find ./ -name "*.html" -exec CMD.
  • Cambio de nombre de subcoincidencia con el valor correspondiente a través del archivo clave-valor .
  • Renombrar a través de un entero ascendente .
  • Renombrar recursivamente archivos y directorios .
  • Apoyo a la marcha en seco .
  • Salida colorida .

Mando:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
Wei Shen
fuente
-5

ls * png | mientras lee -rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; hecho

Ivan P
fuente
Algo no está bien: "mv: falta el operando del archivo de destino después de 'image0001.png'"
Hombre de Internet
3
Hay muchos problemas con su código. Analizar la salida de lssolo requiere problemas. readdebería ser read -r. Todas las sustituciones variables deben estar entre comillas dobles.
Gilles
Podrías escribir esto más efectivamente como for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done. El análisis lsno es necesario ni una buena idea .
kojiro