Предполагая, что вы используете Bash 4, вы можете сделать следующее:
shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar
Когда установлена опция оболочки globstar , ** рекурсивно сопоставляет все подкаталоги текущего каталога. Вторая команда shopt сбрасывает команду; этот шаг не является обязательным.
Как указывает @vanthome, очистка ODT-файлов не принесет пользы, поскольку они на самом деле сжаты. Есть два неудобства:
- Команда zipgrep не принимает в качестве аргумента более одного имени архива, поэтому вам нужно перебрать все файлы ODT.
- zipgrep напечатает только совпадающую строку (которая может быть очень длинной в ODT-файле), поэтому вы все равно не будете знать, какие файлы содержат строку.
Следующие могут достичь желаемых результатов:
shopt -s globstar
for file in **/*.odt; do
unzip -c "$file" | grep -iq GWT && echo "$file"
done
shopt -u globstar
Цикл for проходит через все файлы ODT во всех подкаталогах. Для каждого найденного файла он распаковывает свое содержимое в STDOUT. Затем grep ищет нужную строку, ничего не выводя (-q
). Если совпадение найдено, grep возвращает 0 и команда после логического И (&&
) выполняется, поэтому имя файла отображается на терминале.