Reemplazo de cadena en el shell de Linux
Tengo este nombre de archivo que contiene 3 espacios en blanco que extraje de una base de datos de acceso, se ve así, comillas simples incluidas =>>> ‘Test de map.csv’
Estoy tratando de reemplazar los espacios en blanco por guiones bajos dentro de un bucle for, dentro de un archivo .sh, desafortunadamente, no parece funcionar con:
for file in `ls *.csv`; do
mv "$file" `echo "$file" | tr -s ' ' | tr ' ' '_'`
mv "$file" `echo "$file" | sed -e "s/ /_/g" -e "s/[\[{\\']//g"`
find . -name "* *" -type f | rename "s/ /_/g"
done
Mientras que funciona perfectamente cuando escribo directamente este comando:
mv ‘Test de map.csv’ echo 'Test de map.csv' | tr -s ' ' | tr ' ' '_'
“`
¿Alguien podría ayudar?
davy.ai
Solución
El problema parece estar en el uso del comando
ls
dentro del bucle for, ya que puede causar problemas con los nombres de archivo que contienen caracteres especiales como espacios. Una mejor manera de recorrer archivos en un directorio es utilizarshell globbing
.Prueba la siguiente solución donde utilizamos
shell globbing
para recorrer archivos en el directorio y luego utilizamos la expansión de parámetros para reemplazar espacios por guiones bajos en el nombre de archivo:La expresión
${file// /_}
utiliza la expansión de parámetros para reemplazar todos los espacios en el nombre de archivo por guiones bajos.Ten en cuenta que hemos utilizado la bandera
-v
con el comandomv
para mostrar una salida detallada en la consola, para que puedas ver qué archivos se están renombrando. Puedes eliminar esta bandera para ejecutar el comando en silencio.Además, asegúrate de poner comillas a las variables (
"${file// /_}"
y"$file"
) para evitar problemas de división y expansión de globbing.¡Espero que esto ayude!