Manejo de archivos/carpetas con espacios en script bash

Manejo de archivos/carpetas con espacios en script bash

Necesito buscar lugares.sqlite en un sistema que pueda tener espacios en el nombre de la carpeta; Esto funciona sin espacios en el nombre de la carpeta:

    for each in `find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"` ;do
         echo "${each}"
    done

Que imprime: /home/itsupport/.mozilla/firefox/d2gigsya.default/places.sqlite (por ejemplo)

Sin embargo, si la carpeta contiene espacios, corta la ruta al archivo y rompe mi secuencia de comandos.

En resumen, este tipo de carpeta FUNCIONARÍA en el script:

    $ sudo find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"
    /home/itsupport/.mozilla/firefox/d2gigsya.default/places.sqlite

Y esta carpeta con espacios NO funciona en el script:

    $ sudo find /home/ -name "places.sqlite" | grep -i ".mozilla/firefox"
    /home/itsupport/.mozilla/firefox/Random Ass Location/places.sqlite

Sé que puedes usar $(comando) o algo así, pero no estoy seguro de qué hacer cuando uso find como variable de bucle. Quizás ese sea mi error aquí. De todos modos, cualquier ayuda sería genial.

Respuesta1

findtiene la -print0bandera para lidiar con este problema:

#!/bin/bash

find . -print0 | while read -d $'\0' file
do
    echo ${file}
done

Ejemplo:

$ ls
script.sh  space name
$ ./script.sh 
.
./script.sh
./space name

Respuesta2

Otra opción es utilizar IFS para dividir al final de la línea, en lugar de espacios en blanco.

oldIFS="$IFS"
IFS=$'\n'
for bla in ....
do
...
done
IFS="$oldIFS" # restoring to avoid surprising the rest of the script

Respuesta3

Dado que los archivos están en ubicaciones conocidas, puedes usar

for each in /home/*/.mozilla/firefox/*/places.sqlite
do echo "${each}"
done

información relacionada