Linux: reemplazo de espacios en los nombres de los archivos


Respuestas:


172

Esto debería hacerlo:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done

Esto no funcionó para mí. Afirmó que existían archivos idénticos (con los nombres de archivo incorrectos). Por ejemplo, intentar cambiar el nombre 1 - foo.jpgy mi carpeta ya la tenía 1.jpg.
byxor

3
Encuentro que las comillas invertidas son un poco difíciles de leer cuando están cerca de las comillas. Lo mismo pero más legible seríafor file in *; do mv "$file" $(echo $file | tr ' ' '_') ; done
Kamil S Jaron

Nota: Esto se ejecuta DENTRO del directorio cuyos nombres de archivos desea actualizar. Alternativamente, puede cambiar *a PATH_TO_YOUR_DIRECTORY.
CFitz

72

Prefiero usar el comando 'renombrar', que toma expresiones regulares de estilo Perl:

rename "s/ /_/g" *

Puedes hacer un ensayo con la bandera -n:

rename -n "s/ /_/g" *

3
esto funcionará si tiene el cambio de nombre de estilo perl y no el más simple de redhat / fedora
David Dean

9
la versión fedora seríarename " " "_" *
David Dean

4
renameno está disponible en OSX, parece.
Etienne Low-Décarie

En macOS 10.12.3, renameestá disponible.
Sung Cho

1
@DavidDean El cambio de nombre en Arch Linux solo reemplazará la primera aparición (no es muy conveniente para archivos / directorios con múltiples espacios). Tiene la misma sintaxis que la de fedora, así que sospecho que pueden ser la misma. Pero se puede instalar perl-rename.
prosoitos

15

Usa sh ...

for i in *' '*; do   mv "$i" `echo $i | sed -e 's/ /_/g'`; done

Si desea probar esto antes de apretar el gatillo, cambie mva echo mv.


4

Si usa bash:

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

cuando lo intenté, obtuve mv: al mover varios archivos, el último argumento debe ser un directorio. Pruebe mv --help' for more information. mv: when moving multiple files, last argument must be a directory Try mv --help 'para obtener más información.
Mithun Sreedharan

De nuevo error mv: falta el argumento del archivo Intente mv --help' for more information. mv: missing file argument Try mv --help 'para obtener más información. mv: falta el argumento del archivo. Pruebe mv --help' for more information. mv: missing file argument Try mv --help 'para obtener más información.
Mithun Sreedharan

@ levislevis85: Thx, no sabía eso.
soulmerge

4

¿Qué sucede si desea aplicar la tarea de reemplazo de forma recursiva ? ¿Cómo lo harías tú?

Bueno, yo mismo encontré la respuesta. No es la solución más elegante (también intenta cambiar el nombre de los archivos que no cumplen con la condición) pero funciona. (Por cierto, en mi caso necesitaba cambiar el nombre de los archivos con '% 20', no con un guión bajo)

#!/bin/bash
find . -type d | while read N
do
     (
           cd "$N"
           if test "$?" = "0"
           then
               for file in *; do mv "$file" ${file// /%20}; done
           fi
     )
done

2

Intente algo como esto, asumiendo que todos sus archivos eran .txt:

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done

2
obtuve el siguiente error tr: se deben proporcionar dos cadenas al traducir mv: argumento de archivo faltante Pruebe `mv --help 'para obtener más información.
Mithun Sreedharan

2
Agin error tr: demasiados argumentos Pruebe tr --help' for more information. mv: missing file argument Try mv --help 'para obtener más información.
Mithun Sreedharan

2

Aquí hay otra solución:

ls | awk '{printf("\"%s\"\n", $0)}' | sed 'p; s/\ /_/g' | xargs -n2 mv
  1. usa awk para agregar comillas alrededor del nombre del archivo
  2. usa sed para reemplazar el espacio con guiones bajos; imprime el nombre original con comillas (de awk); luego el nombre sustituido
  3. xargs toma 2 líneas a la vez y la pasa a mv

1

Cotiza tus variables:

for file in *; do echo mv "'$file'" "${file// /_}"; done

Elimine el "eco" para hacer el cambio de nombre real.


Está repitiendo correctamente los comandos mv, ¡pero no cambiando realmente el nombre del archivo!
Mithun Sreedharan

eliminar echo produce un error como mv: can't stat \'1130 lake micigan view.jpg\'': No such file or directory mv: cannot stat \ '1130_1_bedroom_floor_plan.jpg \' ': No existe tal archivo o directorio mv: can't stat \'1130_BedPicture_8.jpg\'': No such file or directory mv: cannot stat \' 1130_diningroom_table.jpg \ '': No existe tal archivo o directorio
Mithun Sreedharan

Linux Linux 2.6.9-42.0.3.EL.wh1smp # 1 SMP Vie 14 de agosto 15:48:17 MDT 2009 i686 i686 i386 GNU / Linux
Mithun Sreedharan

1

La forma más fácil de reemplazar una cadena (carácter de espacio en su caso) con otra cadena en Linuxes usando sed. Puedes hacerlo de la siguiente manera

sed -i 's/\s/_/g' *

Espero que esto ayude.


Esto no resuelve la pregunta.
amit


0

Para cambiar el nombre de todos los archivos con una .pyextensión, use, find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"

Salida de muestra,

$ find . -iname "*.py" -type f                                                     
./Sample File.py
./Sample/Sample File.py
$ find . -iname "*.py" -type f | xargs -I% rename "s/ /_/g" "%"
$ find . -iname "*.py" -type f                                                     
./Sample/Sample_File.py
./Sample_File.py
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.