
Мне нужно найти 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