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?
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
-d
es importante aquí, también he agregado una verificación para evitar mv
que 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
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 -d
quedó obsoleta (ahora -depth
se 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
james.garriss
bmike