¿Cómo eliminar el carácter de espacio (espacio en blanco) del final de los nombres de archivos y carpetas?

El problema con mac es que permite el carácter de espacio al final del archivo o carpeta. Si este archivo o carpeta con carácter de espacio al final se está copiando a FTP usando Filezilla o Dropbox, mac crea carpetas con "Foldername_WhiteSpaceConflict". Para deshacerse de este problema, todos los archivos y carpetas con carácter de espacio deben renombrarse sin carácter de espacio. ¿Qué solución podría ser la mejor usando terminal o algún programa?

Automator puede ser útil, si no eres programador.
Para aquellos que no quieren usar la línea de comando, usen este publicspace.net/ABetterFinderRename/index.html

Respuestas (5)

Aquí está la secuencia de comandos para encontrar y eliminar el espacio final de los archivos y directorios:

#!/bin/bash                                                                                                                                                                                                        

IFS=$'\n'
for file in $(find -d . -name "* ")
do
  target_name=$(echo "$file" | sed 's/[ \t]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e "$target_name" ]; then
          echo "WARNING: $target_name already exists, file not renamed"
      else
          echo "Move $file to $target_name"
          mv "$file" "$target_name"
      fi
  fi
done
¿Qué sucede si tiene un archivo que termina en espacio en un directorio que termina en espacio? ¿No tendrá el archivo un nombre incorrecto después de que se haya cambiado el nombre del directorio?
Buena, actualicé mi respuesta :)
La posición de -des importante aquí, también he agregado una verificación para evitar mvque se sobrescriban los archivos existentes.

Tuve que arreglar el guión un poco más. Para archivos o carpetas que terminan en la letra 't', también eliminaría esa letra. Y la llamada para verificar si el archivo existe no funcionaba correctamente, así que cambió "target_name" a $target_name y ahora funciona.

#!/bin/bash                                                                                                                                                                                                        

IFS=$'\n'
for file in $(find -d . -name "* ")
do
  target_name=$(echo "$file" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e $target_name ]; then
          echo "WARNING: $target_name already exists, file not renamed"
      else
          echo "Move $file to $target_name"
          mv "$file" "$target_name"
      fi
  fi
done
¡Esto funcionó perfectamente para mí! ¡gracias!

Hay una aplicación para Mac llamada ' Name Mangler ', que hará todo lo que quieras hacer con el nombre de un archivo/carpeta, e incluso puedes crear tu propio código y usarlo en la aplicación. Hay una prueba gratuita que le brinda 4 intentos ilimitados, y puede revertir los nombres si comete un error.

Algo como esto debería funcionar:

ruby -e "Dir.glob('* ').each { |name| File.rename name, name.chomp(' ') }"

Esto eliminará los espacios finales de cada archivo/directorio en el archivo pwd.

La respuesta de Devin Stagner 2016 funciona perfectamente, pero la actualicé el 2022-08-20 porque -dquedó obsoleta (ahora -depthse usa), también ese interruptor debe ir después de la ruta ( .) que se está buscando. Se agregó [ ]para encerrar $file y $target_name cuando se muestra la información a través del comando echo, para que sea más obvio lo que se eliminó del nombre del archivo.

#!/bin/bash

IFS=$'\n'
for file in $(find . -depth -name "* ")
do
  target_name=$(echo "$file" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
  if [ "$file" != "$target_name" ]; then
      if [ -e $target_name ]; then
          echo "WARNING: [$target_name] already exists, file not renamed"
      else
          echo "Move [$file] to [$target_name]"
          mv "$file" "$target_name"
      fi
  fi
done