Cambiar varios nombres de archivo reemplazando un carácter


29

Tengo varios archivos nombrados como that : screenshot 13:25.png
Windows luchan por abrir estos archivos probablemente debido a ":".

¿Cómo puedo reemplazarlo?


2
¿Puede aceptar una respuesta para marcar la pregunta como resuelta? Esto ayudará mucho a otros usuarios.
MERose

Respuestas:


52

En una terminal, cden el directorio correcto y luego ejecute esto.

rename 's/\:/-/g' *.png -vn

Esto hará una vista previa del cambio de nombre. Debe reemplazar :con -.

Si eso parece correcto, elimine el ndel final y luego hará el cambio de nombre real.

Nota : las versiones de Ubuntu anteriores a la 17.04 no se incluyen rename, pero todavía está disponible en los repositorios predeterminados, así que úselo sudo apt install renamepara obtenerlo


Gracias por su respuesta. Lo intenté y tengo este problema: El patrón de sustitución no finalizó en (eval 1) línea 1.
user236152

@ user236152 Lo siento, me enojé un poco con las barras invertidas que se escapaban (¡estaba en piloto automático!). Se eliminó una pareja y debería ser válida ahora.
Oli

Quizás una simple secuencia de comandos Nautilus que reemplace todos los caracteres que puedan causar problemas en otras plataformas (ejecutándose en todos los archivos seleccionados) podría ser útil para las personas "multiplataforma".
Sadi

2
¿Por qué usarlo? Le muestra lo que está haciendo (hace que sea más fácil revertir si comete un error). ¿Por qué al final? Solo para que puedas eliminarlo (o el n) fácilmente.
Oli

1
@nightcrawler Debería poder encadenar reemplazos completamente separados:rename 's/\:/-/g; s/%28/ /g; s/%29//g' ...
Oli

10

Aquí hay una solución de bash puro:

for i in *:*; do
    mv "$i" "${i//:/_}"
done

El ${var//pattern/replacement}formato reemplazará todas las apariciones de patterncon replacementen la variable $var. Para obtener más información sobre las capacidades de manipulación de cadenas de bash, consulte aquí .

Si desea hacer esto para varios personajes, simplemente puede colocarlos en una clase de caracteres. Así, por ejemplo, para reemplazar a todos ;, :, =, +, %, ,con guiones bajos, usted podría hacer:

$ ls 
1foo:bar  2foo:bar:baz  3foo;bar  4foo=bar  5foo%bar  6foo,bar  7foo+bar
$ for i in *; do mv "$i" "${i//[:;=%,+]/_}"; done
$ ls
1foo_bar  2foo_bar_baz  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar

Básicamente, la idea es que eso [ ]significa any of the characters listed. Por lo tanto, al colocar todos los personajes que desea reemplazar en la clase de personajes, todos se tratan a la vez.


Para los caracteres específicos que solicitó, las cosas son un poco más complejas porque algunos de ellos deben escaparse (estoy ignorando el hecho de /que * nix no lo permite en los nombres de archivos más de lo que lo hace Windows, por lo que no será un problema):

$ ls
1foo<bar  2foo>bar  3foo:bar  4foo\bar  5foo|bar  6foo*bar  7foo?bar  8foo"bar  9foo'bar
$ for i in *; do mv "$i" "${i//[<>:\\|*\'\"?]/_}"; done
$ ls
1foo_bar  2foo_bar  3foo_bar  4foo_bar  5foo_bar  6foo_bar  7foo_bar  8foo_bar  9foo_bar

Tenga en cuenta que escapé del \, 'y "agregando un \en frente de cada uno.


¿Se puede mejorar esto para reemplazar varios caracteres individuales (por ejemplo, todos aquellos que Windows no acepta) con otros?
Sadi

1
@Sadi ver respuesta actualizada.
terdon

Básicamente hay nueve: "<>:" / \ | ? * "
Sadi

@Sadi ver respuesta actualizada.
terdon

Gracias, esto podría ayudar a crear un script de Nautilus que haga que los nombres de los archivos seleccionados sean compatibles con Windows.
Sadi

2

Si prefiere una GUI, instale pyrenamer:

sudo apt-get install pyrenamer

Luego ejecútalo:

pyrenamer

Tiene docenas de opciones para patrones y formatos de cambio de nombre.


1

Prefiero GUI pero como una extensión de Nautilus, es decir, Nautilus Actions Extra :

sudo add-apt-repository ppa:nae-team/ppa
sudo apt-get update
sudo apt-get install nautilus-actions-extra
nautilus -q

(Ver www.webupd8.org/2011/12/nautilus-actions-extra-pack-of-useful.html )

Luego, cuando selecciona archivos para cambiarles el nombre y hace clic en Cambiar nombre en el menú contextual, se le ofrecen muchas opciones para cambiar el nombre de los archivos.


0

El renameutilspaquete tiene un práctico programa llamado qmvque proporciona un cambio de nombre de lote interactivo. Lo ejecuta en un directorio o una lista de archivos y genera un archivo de texto temporal que contiene sus nombres de archivo e inicia su editor favorito. Cuando salga del editor, cualquier nombre de archivo que haya cambiado se renombrará en consecuencia. qmvconvierte un problema de cambio de nombre de lote en un problema de edición de texto.

En este caso, puede usar qmv -f do *:*para editar los nombres de todos los archivos que contienen dos puntos, y luego el :%s/:/_/gcomando en Vim (o una búsqueda y reemplazo correspondiente en cualquier editor que use).

La -f doopción establece el formato del archivo de texto para que solo tenga el nombre del archivo de destino, lo que simplifica la búsqueda y reemplazo. El formato predeterminado tiene dos copias del nombre del archivo en cada línea, y solo edita la segunda. Eso le permite hacer lo correcto si ha eliminado o reordenado líneas en el archivo, pero no siempre es lo más fácil. También hay otros formatos.

Con qmv, puede optar por canalizar el archivo generado a través de un comando de su elección, como, por ejemplo sed, si no desea la capacidad interactiva.


0

Y aquí hay una secuencia de comandos Nautilus que reemplaza (¿todos?) Los caracteres incompatibles con Windows con un guión en todos los nombres de archivo seleccionados (según la respuesta de terdon ;-)

#!/bin/bash
filesall=""
while [ $# -gt 0 ]
    do
        files=`echo "$1" | sed 's/ /\?/g'`
        filesall="$files $filesall"
        shift
    done
for i in $filesall; do mv "$i" "${i//[<>:\\|*\'\"?]/-}"; done

0

Thunar (el administrador de archivos XFCE) tiene una buena característica incorporada para renombrar archivos de forma masiva. Tiene opciones para eliminar / reemplazar caracteres, buscar y reemplazar, numerar archivos y más.

Instalar thunar:

sudo apt-get install thunar

Abra thunar, busque sus archivos, selecciónelos y elija 'cambiar nombre' (a través del menú contextual o F2)


0
@echo off
echo.
echo. How many Characters Do You Want To Remove
echo.
echo. From The End Of The FileName ?
echo.
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (
set oldName=%%a
Set newName=!oldName:~0,-%variable%!.mp3
Ren "!oldName!" "!newName!"
)
exit

Esto funciona bien y tiene un indicador variable ... Asigne un nombre al archivo como _ Truncar los últimos caracteres.cmd
TekWiz2010

3
Si bien esto puede ser correcto, utiliza un lenguaje de secuencias de comandos por lotes de Windows. Estamos en AskUbuntu, un sitio para preguntas relacionadas con Ubuntu y, por lo tanto, herramientas relacionadas con Ubuntu. Mi opinión es que esta respuesta puede no ser necesariamente apropiada aquí.
Sergiy Kolodyazhnyy

Tendría que ejecutarlo a través de Wine, pero probablemente sea posible ejecutar esto en Ubuntu ... Es solo una respuesta extraña, es todo.
Oli
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.