Lidando com arquivos/pastas com espaços no script bash

Lidando com arquivos/pastas com espaços no script bash

Preciso procurar por places.sqlite em um sistema que possa ter espaços no nome da pasta; Isso funciona sem espaços no nome da pasta:

    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 exemplo)

No entanto, se a pasta contiver espaços, ela corta o caminho para o arquivo e quebra meu script!

Para recapitular, este tipo de pasta funcionaria no script:

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

E esta pasta com espaços NÃO funciona no script:

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

Eu sei que você pode usar $(command) ou algo assim, mas não tenho certeza do que fazer quando uso find como variável de loop. Talvez esse seja o meu erro aqui. De qualquer forma, qualquer ajuda seria ótima.

Responder1

findtem a -print0bandeira para lidar com este problema:

#!/bin/bash

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

Exemplo:

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

Responder2

Outra opção é usar IFS para dividir no final da linha, em vez de quaisquer caracteres de espaço em branco.

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

Responder3

Como os arquivos estão em locais conhecidos, você pode simplesmente usar

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

informação relacionada