Цитирование через вывод вывода в Bash, где имя файла содержит пробелы

Я пытаюсь найти файлы, которые могут содержать пробелы. Я пытаюсь использовать -print0 и установить IFS здесь, вот мой script

IFS=$'\0';find people -name '*.svg' -print0 | while read file; do
    grep '<image' $file > /dev/null && echo $file | tee -a embeded_images.txt;
done

Я пытаюсь очистить весь файл svg, содержащий вложенные изображения, он работает без -print0, но не сработает один файл, поэтому я останавливаю script. Вот более простой пример, который тоже не работает.

IFS=$'\0';find . -print0 | while read file; do echo $file; done

он ничего не отображает.

Ответы

Ответ 1

Используйте read -d '' -r file и установите IFS только для контекста read:

find people -name '*.svg' -print0 | while IFS= read -d '' -r file; do
    grep '<image' "$file" > /dev/null && echo "$file" | tee -a embeded_images.txt;
done

И укажите свои переменные.

Ответ 2

Хотя ответ Денниса Уильямсона абсолютно правильный, он создает подоболочку, что помешает вам установить какие-либо переменные внутри цикла. Вы можете рассмотреть возможность замены процесса:

while IFS= read -d '' -r file; do
    grep '<image' "$file" > /dev/null && echo "$file" | tee -a embeded_images.txt
done < <(find people -name '*.svg' -print0)

Первый < указывает, что вы читаете из файла, а <(find...) заменяется именем файла (обычно дескриптором для канала), который возвращает результат find напрямую. Поскольку while чтения из файла вместо канала, ваш цикл может устанавливать переменные, доступные извне области.