處理 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

另一種選擇是使用 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

相關內容