2009-11-27 17 views

Respuesta

104

Esto debe hacerlo:

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

Esto no funcionó para mí. Afirmaba que existían archivos idénticos (con los nombres de archivo incorrectos). P.ej. tratando de renombrar '1 - foo.jpg' y mi carpeta ya tenía' 1.jpg' en ella. – byxor

0

Creo que su respuesta está en Replace spaces in filenames with underscores.

+1

Si bien esto puede teóricamente responder a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) para incluir las partes esenciales de la respuesta aquí y proporciona el enlace para referencia. –

1

Pruebe algo como esto, suponiendo que todos los archivos .txt fueron de:

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

tiene el error abajo tr: dos cadenas se debe dar al traducir mv: falta argumento de archivo Pruebe 'mv --help' para más información. –

+2

Agin error tr: demasiados argumentos Pruebe 'tr --help 'para obtener más información. mv: falta argumento de archivo Pruebe 'mv --help' para más información. –

3

Si utiliza bash:

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

cuando he intentado, tengo mv: al mover varios archivos, último argumento debe ser un directorio Pruebe '--help mv' para más información. mv: al mover varios archivos, último argumento debe ser un directorio Pruebe '--help mv' para más información. –

+0

Debe ser '$ {FILE// _}' – soulmerge

+0

que solo reemplaza 1 espacio – ghostdog74

7

Uso sh ...

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

Si Si desea probar esto antes de apretar el gatillo simplemente cambie mv a echo mv.

+0

Este también funcionó bien –

1

Cita sus variables:

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

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

+0

¡Se está haciendo eco de los comandos de mv de forma inmediata, pero sin realmente cambiar el nombre del archivo! –

+0

eliminación de eco produce error como mv: Imposible identificar '\ '1130 lago Micigan view.jpg \' ': No existe el fichero o directorio mv: Imposible identificar' \' 1130_1_bedroom_floor_plan.jpg \ '': No existe el fichero o directorio MV: no puede stat '\ '1130_BedPicture_8.jpg \' ': no ​​existe el fichero o directorio mv: Imposible identificar' \' 1130_diningroom_table.jpg \ '': no ​​existe el fichero o directorio –

+0

¿cuál es su sistema operativo? – ghostdog74

40

yo prefiero usar el comando 'Cambiar nombre', que tiene expresiones regulares al estilo Perl:

rename "s/ /_/g" * 

Se puede hacer un ensayo con el indicador -n:

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

esto funcionará si * * que tiene el cambio de nombre de estilo Perl y no Cuanto más simple sea RedHat/Fedora uno –

+4

la versión Fedora serían 'renombrar "" "_" *' ' –

+3

rename' no está disponible en OS X que aparece. –

4

¿Qué pasaría si ¿Desea aplicar la tarea de reemplazo recursivamente? ¿Cómo lo harías tú?

Bueno, acabo de encontrar la respuesta yo mismo. No es la solución más elegante (intenta renombrar también archivos que no cumplen con la condición) pero funciona. (Por cierto, en mi caso que tenía que 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 
0

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

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

Espero que esto ayude.

-1

Estoy tratando de ejecutar este como un script https://hastebin.com/xemitireri.bash,

#!/bin/bash 
# https://stackoverflow.com/questions/1806868/linux-replacing-spaces-in-the-file-names 
find . -type d | while read N 
do 
    (
      cd "$N" 
      if test "$?" = "0" 
      then 
       for file in *; do mv "$file" ${file// /_}; done 
      fi 
    ) 
done 

que desea ejecutar este recursiva, en una carpeta, que tiene varias carpetas en el mismo, cada una de ellas con varios archivos en ellos. Tanto los nombres de las carpetas como los de los archivos tienen espacios (por ejemplo, para ejecutarlo en la carpeta "Prueba" que contiene "Buen álbum" que contiene "Disco 1", "Disco 2", etc. La carpeta de cada disco tiene "Canción 1"). .txt "," Song 2.txt "," Song 3.txt, etc.). Esto DEN cambió el nombre de las carpetas, pero no los archivos dentro de las carpetas. Recibo el error bash: cd: ./Disk 02: Ningún archivo o directorio bash: cd: ./Disk 01: No existe ningún archivo o directorio bash: cd:./ Disco 03: No existe el fichero o directorio

+0

Esto no es una respuesta, pero otra cuestión. Por favor considere abrir una nueva pregunta. – Fabien

Cuestiones relacionadas