Используйте -Z1
параметр unzip
вместо -l
. Он выводит один файл на строку без дополнительной информации. Вы должны прочитать его вывод вместо того, чтобы зациклить его, чтобы предотвратить разбиение слов. У вас все еще могут быть проблемы с именами файлов, содержащими символ новой строки (но я не смог их сжать, $'a\nb'
был сохранен как a^Jb
и извлечен как ab
).
Кроме того, в вашем if
отсутствует then
.
Кроме того, не анализируйте выходные данные ls
, вы можете перебирать саму маску с разбитым файлом.
Вам не нужно проверять, что grep
выводит что-либо, просто запустите его с -q
и проверьте его состояние выхода.
Не забудьте заключить в кавычки переменные, которые могут содержать пробелы или другие специальные символы.
for z in /path/to/archives/*.zip ; do
while IFS= read -r f ; do
if unzip -p "$z" "$f" | grep -q "$string" ; then
unzip "$z" "$f"
fi
done < <(unzip -Z1 "$z" '*.xml')
done