Linux: reemplazo de espacios en los nombres de los archivos

96

Tengo varios archivos en una carpeta y quiero reemplazar cada carácter de espacio en todos los nombres de archivo con guiones bajos. ¿Cómo puedo conseguir esto?

Mithun Sreedharan
fuente

Respuestas:

172

Esto debería hacerlo:

for file in *; do mv "$file" `echo $file | tr ' ' '_'` ; done
neesh
fuente
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" *
DF.
fuente
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.

DigitalRoss
fuente
4

Si usa bash:

for file in *; do mv "$file" ${file// /_}; done
Murali VP
fuente
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
javipas
fuente
2

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

for files in *.txt; do mv “$files” `echo $files | tr ‘ ‘ ‘_’`; done
Amir Afghani
fuente
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
yoogottamk
fuente
1

Cotiza tus variables:

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

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

ghostdog74
fuente
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.

Desta Haileselassie Hagos
fuente
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
akilesh raj
fuente