Почему мой рекурсивный grep не работает?

Почему мой рекурсивный grep не работает?

Я нахожусь в родительском каталоге и хочу найти все файлы 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

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

решение1

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

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

решение2

Если вы используете Bash 4, вы можете сделать следующее:

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

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

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

  1. ThezipgrepКоманда не принимает в качестве аргумента более одного имени архива, поэтому вам придется перебрать все файлы ODT.
  2. zipgrepвыведет только соответствующую строку (которая может бытьоченьlong в файле ODT), поэтому вы все равно не узнаете, в каких файлах содержится эта строка.

Достичь желаемых результатов можно следующими способами:

shopt -s globstar

for file in **/*.odt; do
    unzip -c "$file" | grep -iq GWT && echo "$file"
done

shopt -u globstar

TheдляЦикл проходит по всем файлам ODT во всех подкаталогах. Для каждого найденного файла он распаковывает его содержимое в STDOUT. Затем,грэпищет нужную строку, ничего не выводя ( -q). Если совпадение найдено,грэпвозвращает 0, и команда после логического И ( &&) выполняется, поэтому имя файла отображается на терминале.

Связанный контент