Use esto con bash
:
find $1 -name "* *.xml" -type f -print0 | \
while read -d $'\0' f; do mv -v "$f" "${f// /_}"; done
find
buscará archivos con un espacio en el nombre. Los nombres de archivo se imprimirán con un nulobyte ( -print0
) como delimitador para hacer frente también a nombres de archivo especiales. Luego, el read
archivo incorporado lee los nombres de archivo delimitados por el nulobyte y finalmente mv
reemplaza los espacios con un guión bajo.
EDITAR: si también desea eliminar los espacios en los directorios, es un poco más complicado. Los directorios se renombran y luego ya no se puede acceder por los nombres find
encontrados. Prueba esto:
find -name "* *" -print0 | sort -rz | \
while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
El sort -rz
invierte el orden de los archivos, por lo que los archivos más profundos en una carpeta es el primero en mover y la propia carpeta será la última. Por lo tanto, nunca hay carpetas renombradas antes de que todos los archivos y carpetas cambien de nombre dentro de ella. El mv
comando en el bucle también ha cambiado un poco. En el nombre de destino, solo eliminamos los espacios en el nombre base del archivo, de lo contrario no sería accesible.
find . -name "* *" -print0 | sort -rz | \ while read -d $'\0' f; do mv -v "$f" "$(dirname "$f")/$(basename "${f// /_}")"; done
Utilizando
rename
o con
$1
Utilizando
mv
o con
$1
fuente
Este es un método que encontré al enfrentar el mismo problema:
Estaba escribiendo un archivo de script bash para actualizar automáticamente mis certificados SSL.
fuente
Uso
rename
:No hay necesidad de
find
:)fuente