bash スクリプトでスペースを含むファイル/フォルダを処理する

bash スクリプトでスペースを含むファイル/フォルダを処理する

フォルダ名にスペースが含まれる可能性があるシステムで places.sqlite を検索する必要があります。これはフォルダ名にスペースがなくても機能します。

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

出力内容: /home/itsupport/.mozilla/firefox/d2gigsya.default/places.sqlite (例)

ただし、フォルダーにスペースが含まれていると、ファイルへのパスが分割され、スクリプトが壊れてしまいます。

要約すると、このタイプのフォルダーはスクリプトで機能します。

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

スペースを含むこのフォルダーはスクリプトでは機能しません。

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

$(command) などを使用できることはわかっていますが、ループ変数として find を使用する場合に何をすればよいかわかりません。おそらく、これは私の間違いです。とにかく、どんな助けでも大歓迎です。

答え1

find-print0この問題に対処するためのフラグがあります:

#!/bin/bash

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

例:

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

答え2

もう 1 つのオプションは、空白文字の代わりに IFS を使用して行末で分割することです。

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

答え3

ファイルはよく知られた場所にあるので、

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

関連情報