1

Я нахожусь в родительском каталоге и хочу найти любые файлы ODT (LibreOffice Writer), в которых есть фраза "GWT".

Я нахожусь на рабочем столе Ubuntu 12.04. Из терминала:

myUser@myMachine:~/sandbox$ pwd
/home/myUser/sandbox
myUser@myMachine:~/sandbox$ ls
cloudflip  doctrang  eclipse   lookslike  scripts       squirrel  warlib

Все эти объекты файловой системы (eclipse , scripts и т.д.) Являются папками.

myUser@myMachine:~/sandbox$ grep -i -r "GWT" *.odt
grep: *.odt: No such file or directory

Куда я иду здесь? Заранее спасибо!

2 ответа2

3

ODT-файлы на самом деле являются Zip-файлами (см. Https://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-files), вы должны иметь возможность выполнить поиск с помощью команды zipgrep примерно так:

find ~/sandbox -name "*.odt" -type f -print0 | xargs -0 zipgrep GWT

0

Предполагая, что вы используете Bash 4, вы можете сделать следующее:

shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar

Когда установлена опция оболочки globstar , ** рекурсивно сопоставляет все подкаталоги текущего каталога. Вторая команда shopt сбрасывает команду; этот шаг не является обязательным.

Как указывает @vanthome, очистка ODT-файлов не принесет пользы, поскольку они на самом деле сжаты. Есть два неудобства:

  1. Команда zipgrep не принимает в качестве аргумента более одного имени архива, поэтому вам нужно перебрать все файлы ODT.
  2. 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 и команда после логического И (&&) выполняется, поэтому имя файла отображается на терминале.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .