1

Мне нужно искать местами.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 в качестве переменной цикла. Может быть, это моя ошибка здесь. В любом случае, любая помощь будет отличной.

3 ответа3

3

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
0

Поскольку файлы находятся в известных местах, вы можете просто использовать

for each in /home/*/.mozilla/firefox/*/places.sqlite
do echo "${each}"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .