Цитирование через вывод вывода в 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
</image'>

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

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

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

2 ответа

Используйте 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
</image'>

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


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

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)
</image'>

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

licensed under cc by-sa 3.0 with attribution.