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
find
tiene la -print0
bandera 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