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
find
tem a -print0
bandeira 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