Pregunta

Tengo varios archivos en una carpeta y quiero reemplazar todos los caracteres de espacio en todos los nombres de archivo con guiones bajos. ¿Cómo puedo lograr esto?

¿Fue útil?

Solución

Esto debería hacerlo:

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

Otros consejos

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

rename "s/ /_/g" *

Puedes hacer un recorrido en seco con la marca -n:

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

Usa sh ...

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

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

¿Qué sucede si desea aplicar la tarea de reemplazo recursivamente ? ¿Cómo harías eso?

Bueno, acabo de encontrar la respuesta a mí mismo. No es la solución más elegante (intenta renombrar también 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

Si usas bash:

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

Cita tus variables:

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

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

Prueba algo como esto, asumiendo que todos tus archivos fueron de .txt:

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

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

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

Espero que esto ayude.

Aquí hay otra solución:

ls | awk '{printf("\"%s\"\n", <*>)}' | 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); entonces el nombre sustituido
  3. xargs toma 2 líneas a la vez y lo pasa a mv

Para cambiar el nombre de todos los archivos con el uso de la extensión .py , encontrar . -iname " *. py " -tipo f | xargs -I% renombrar " 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top