Недавно я подумал о написании скрипта Groovy для поиска JAR-файлов по определенной строке, но решил сначала искать альтернативу, а не писать скрипт. Альтернатива должна была быть простой в использовании, свободно доступной и не перегруженной множеством зависимостей. Я был рад, что я посмотрел первым, потому что подход на основе Linux, предоставленный «jan61», удовлетворит мою потребность. В этом посте я более подробно рассмотрю этот пример.
Как описано в потоке LinuxQuestions.org, ищущем содержимое файла .class в jar (для строк) , однострочная команда в Linux хорошо выполняет рекурсивный поиск JAR из заданного каталога для заданной строки. Этот поиск не ищет имена самих записей в JAR, а скорее ищет содержимое каждого доступного для поиска файла в JAR. Вот эта простая строка (токен <stringWithOrWithoutSpacesToFind> представляет строку для поиска):
Команда Linux для поиска содержимого файлов .jar по определенной строке
find . -iname '*.jar' -printf "unzip -c %p | grep -q '<stringWithOrWithoutSpacesToFind>' && echo %p\n" | sh
Мне нравится иметь это в форме сценария (или как псевдоним), потому что это имя легче запомнить, чем вводить всю эту команду каждый раз. Вот пример сценария, который можно использовать.
Форма скрипта Linux для вышеуказанной команды
printf "Searching JARs for string '${1}'...\n" find . -iname '*.jar' -printf "unzip -c %p | grep -q '${1}' && echo %p\n" | sh
Две версии команды, показанные непосредственно выше, будут работать как есть, а остальная часть этого блога посвящена тому, как работает команда. Я начинаю анализировать команду изнутри и выхожу наружу.
Linux распаковать команду «list [s], test [s] и извлечь [s] сжатые файлы в ZIP-архив». -c
Передаются распакованной команде «Экстракт [с] файлами на стандартный вывод» и включает в себя имя извлеченных файлов с этим стандартным выводом. Это %p
связано с командой поиска Linux . Более конкретно, %p
это директива для -printf
флага find
команды, которая направляет его на включение имени найденного файла.
Каждый найденный файл распаковывается, и его содержимое направляется на стандартный вывод, где он передается в команду grep для поиска предоставленной текстовой строки. Предоставленный -q
параметр указывает «тихий» режим, в котором ничего не записывается на стандартный вывод, и grep
немедленно выходит с нулевым кодом состояния при обнаружении совпадения. В && символы указывают на то, что команда эхо будет работать , чтобы распечатать имя файла с сопоставления содержимого в Grep-е изд для строки , если (и только когда) GREP команда возвращает код успешного (0).
Все вышеперечисленное выполняется только для файлов с .jar
расширением благодаря find . -iname '*.jar'
команде. Все это по трубопроводу.
Спасибо jan61 за элегантную команду Linux, описанную в этом посте, которая облегчает поиск содержимого файлов в JAR-файлах по заданной строке.