
Hola, tengo un montón de archivos con espacios en el nombre. ¿Hay alguna manera de convertirlos en archivos nuevos sin espacios? Por ejemplo, tengo el archivo Hello World.pdf. Quiero moverlo a Hello_World.pdf. Obviamente, para un archivo puedo usar el comando mv pero quiero hacerlo con todos los archivos de una carpeta.
Gracias
Respuesta1
Puedes usar eltrosedcomandos para esto:
for file in *.pdf
do
newname=$(echo $file | tr ' ' _)
mv "$file" $newname
done
Tenga en cuenta que esto utiliza la sintaxis POSIX más nueva para la sustitución de comandos: $(dominio).
Si estás usando un shell Bourne muy antiguo, necesitarás usar comillas invertidas:
newname=`echo $file | tr ' ' _`
Respuesta2
Aquí hay un par de scripts que uso para esta tarea:
#!/bin/ksh
# Name : unspace - replace spaces by underscores in file names
# Usage : unspace [file ...]
# Example : unspace *.doc
unspace()
{
ls "$@" | while a=$(line)
do
file=$(echo $a | grep " ")
if [ -n "$file" ]
then
file="$(print "$file" | sed 's/ /_/g')"
print "$a" "->" "$file"
mv "$a" "$file"
fi
done
}
[[ "$(basename $0)" = unspace ]] && unspace "$@"
El siguiente corrige recursivamente todos los nombres en el directorio actual. Tenga en cuenta que todavía necesita algo de trabajo si los nombres de los directorios también contienen espacios incrustados.
#!/bin/ksh
find . |
while a=$(line)
do
newName="$(print $a | tr ' ' '_')"
if [ "$a" != "$newName" ]
then
mv "$a" "$newName"
print $a moved
else
print $a unchanged
fi
done
Respuesta3
Si tienes bash, no es necesario llamar a herramientas externas.
for file in *.pdf
do
if [ -f "$file" ];then
echo mv "$file" "${file// /_}"
fi
done