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