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

1

Eu preciso procurar por places.sqlite em um sistema que pode 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 cortará o caminho até o arquivo e quebrará meu script!

Para recapitular, esse 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 $ (comando) ou algo assim, mas não tenho certeza do que fazer quando estou usando o find como a variável de loop. Talvez esse seja o meu erro aqui. De qualquer forma, qualquer ajuda seria ótima.

    
por Mike Q 11.01.2013 / 00:41

3 respostas

3

find tem o sinal -print0 para lidar com este problema:

#!/bin/bash

find . -print0 | while read -d $'
$ ls
script.sh  space name
$ ./script.sh 
.
./script.sh
./space name
' file do echo ${file} done

Exemplo:

#!/bin/bash

find . -print0 | while read -d $'
$ ls
script.sh  space name
$ ./script.sh 
.
./script.sh
./space name
' file do echo ${file} done
    
por 11.01.2013 / 00:42
2

Outra opção é usar o IFS para dividir o final da linha, em vez de usar qualquer caractere 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
    
por 11.01.2013 / 00:53
0

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

for each in /home/*/.mozilla/firefox/*/places.sqlite
do echo "${each}"
done
    
por 11.01.2013 / 00:58

Tags