在 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

相关内容