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:
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:
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:
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.
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
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.
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).
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
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 .
thunar -B *.png
para la herramienta gui de cambio de nombre masivo de thunar.Respuestas:
Si está utilizando Bash u otro shell compatible con POSIX:
fuente
En Debian y derivados, Perl's
rename
funciona de manera similar ased
esto:También está el
rename
deutil-linux
que funciona así, en su lugar:fuente
rename
programa 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
.rename
tomar una de al patrón de sustitución:rename [options] <expression> <replacement> <file>...
zmv
El shell zsh tiene un poderoso comando de cambio de nombre por lotes llamado
zmv
.Primero debe habilitar el
zmv
comando de la siguiente manera (esto puede ir a su~/.zshrc
).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: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:fuente
zmv
prezto 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'
Normalmente uso la agradable y sencilla utilidad mmv ( página man ) para este caso de uso:
realizará tu tarea.
El
#1
patró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.
fuente
POSIX sh para bucle
Utiliza sed para renombrar
fuente
Perl me gusta así que:
También puede usar el mismo patrón para otras tareas como copiar los archivos a otro directorio:
fuente
rename($old,$_)
qmv
El comando
qmv
derenameutils
abre 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
En editor:
Editar nombres en la columna derecha:
(Eliminar el
image
prefijo de todas las líneas usando el modo de bloque visual)Registro de cambio de nombre:
(por ejemplo Ubuntu:
apt-get install renameutils
)fuente
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
Seguro, puede lidiar con espacios, nuevas líneas, barras invertidas y cualquier otra cosa :
fuente
POSIX sh usando un ciclo while
Lectura de nombres desde el
find
comando.Leer nombres de un archivo
fuente
Usando la expansión del refuerzo de la carcasa :
fuente
Para Windows y Linux , este script Perl servirá; en este caso:
El script podría ejecutarse recursivamente bajo directorios e incluso anteponer un recuento a todos ellos:
Los caracteres UTF-8 también se tratan correctamente, tanto en Windows como en Linux.
fuente
Puede usar esta herramienta: rnm ( página web )
Para su caso, el comando sería:
Puedes encontrar más ejemplos / documentos aquí .
fuente
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:
caracteristicas:
find ./ -name "*.html" -exec CMD
.Mando:
fuente
ls * png | mientras lee -rf; do f2 = "` echo $ f | sed -e's / image // '`"; mv $ f $ f2; hecho
fuente
ls
solo requiere problemas.read
debería serread -r
. Todas las sustituciones variables deben estar entre comillas dobles.for f in *png; do f2="$(echo "$f" | sed -e 's/image//')"; mv "$f" "$f2"; done
. El análisisls
no es necesario ni una buena idea .