我需要在文件夹名称中可能包含空格的系统上搜索 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