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