Reemplazar espacios en nombres de archivos desde la línea cmd unix

Reemplazar espacios en nombres de archivos desde la línea cmd unix

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

información relacionada