Давайте сделаем это! К сожалению, существующие ответы несовершенны по ряду очевидных причин, в том числе и здесь, и в популярном дубликате .
Принятый ответ , например, является Bash -специфическим(плохим)и жестко кодирует желаемый шаблон поиска в одну -из 10 -функцию оболочки строки(это еще хуже). Следующий по количеству голосов ответ использует основанные на FUSE -псевдо--файловые системы (, которые явно безумны). Точно так же ответ с наибольшим количеством голосов в вышеупомянутом дубликате дает неоднозначный, -неудобочитаемый для человека -вывод(просто... тьфу).
Я — сморщенное неодобрение Джека.
На ринг вышел новый претендент:
# str find_in_zip(str regex, str zip_filename1,...)
#
# Find all paths contained in any zip-formatted archives with the passed
# filenames such that the relative pathnames of these paths in these
# archives match the passed extended regular expression.
function find_in_zip() {
(( $# >= 2 )) || {
echo 'Expected one extended regular expression and one or more zip filenames.' 1>&2
return 1
}
# Localize and remove the passed regex from the argument list.
local regex="${1}" zip_filename
shift
# For each passed zip filename...
for zip_filename in "${@}"; do
# Print the name of this filename for disambiguity.
echo "${zip_filename}:"
# Print all paths in this file matching this regex.
command unzip -l "${zip_filename}" |
command grep --extended-regexp --color=always "${regex}"
# Page the above output for readability.
done | less --RAW-CONTROL-CHARS
}
Для удобства эта функция вызывается с той же сигнатурой, что и grep
. А именно, эта функция сначала принимает искомое регулярное выражение, а затем вариативную последовательность одного или нескольких имен zip-файлов.
Аналогичным образом, эта функция была протестирована как в Bash, так и в zsh. Добавьте приведенный выше код в ~/.bashrc
или ~/.zshrc
, и великая слава zip-файла будет у вас, в идеале с включенным set -e
для здравомыслия и строгости.
Чтобы продемонстрировать,давайте найдем набор всех классов, встроенных в I2P файлы JAR, установленные в Gentoo Linux, имена которых начинаются ровно с семи символов верхнего регистра, за которыми следует один символ нижнего регистра – просто потому, что:
$ find_in_zip '/[A-Z]{7}[a-z]' /usr/share/i2p/lib/*.jar
/usr/share/i2p/lib/addressbook.jar:
/usr/share/i2p/lib/BOB.jar:
/usr/share/i2p/lib/commons-el.jar:
/usr/share/i2p/lib/desktopgui.jar:
/usr/share/i2p/lib/i2p.jar:
568 01-16-2020 00:20 freenet/support/CPUInformation/AMDCPUInfo.class
236 01-16-2020 00:20 freenet/support/CPUInformation/VIACPUInfo.class
/usr/share/i2p/lib/i2psnark.jar:
/usr/share/i2p/lib/i2ptunnel.jar:
/usr/share/i2p/lib/jasper-compiler.jar:
/usr/share/i2p/lib/jasper-runtime.jar:
/usr/share/i2p/lib/jetty-continuation.jar:
/usr/share/i2p/lib/jetty-deploy.jar:
/usr/share/i2p/lib/jetty-http.jar:
/usr/share/i2p/lib/jetty-i2p.jar:
/usr/share/i2p/lib/jetty-io.jar:
/usr/share/i2p/lib/jetty-java5-threadpool.jar:
/usr/share/i2p/lib/jetty-rewrite-handler.jar:
/usr/share/i2p/lib/jetty-security.jar:
/usr/share/i2p/lib/jetty-servlet.jar:
/usr/share/i2p/lib/jetty-servlets.jar:
/usr/share/i2p/lib/jetty-sslengine.jar:
/usr/share/i2p/lib/jetty-start.jar:
/usr/share/i2p/lib/jetty-util.jar:
/usr/share/i2p/lib/jetty-webapp.jar:
/usr/share/i2p/lib/jetty-xml.jar:
/usr/share/i2p/lib/jstl.jar:
/usr/share/i2p/lib/mstreaming.jar:
/usr/share/i2p/lib/org.mortbay.jetty.jar:
/usr/share/i2p/lib/org.mortbay.jmx.jar:
/usr/share/i2p/lib/routerconsole.jar:
/usr/share/i2p/lib/router.jar:
5598 01-16-2020 00:20 org/cybergarage/upnp/ssdp/HTTPMUSocket.class
/usr/share/i2p/lib/sam.jar:
/usr/share/i2p/lib/standard.jar:
/usr/share/i2p/lib/streaming.jar:
/usr/share/i2p/lib/systray.jar:
Вы... вероятно, не хотели бы делать это вручную.