Работа с файлами/папками с пробелами в скрипте 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

Связанный контент