Unixでzipファイル内を検索できますか?

Unixでzipファイル内を検索できますか?

いくつかのzipファイルを含む数百のディレクトリがあります。これで、これらのzipファイルにはabc.jpgという名前の画像が含まれています。 zipファイルは任意のフォルダまたはサブフォルダにある可能性があるため、すべての場所に抽出するのは困難です。

私はこれらの画像ファイルを収集したいだけです。可能ですか?

答え1

かつて、複数のzipファイルでクラスファイルを見つけるのと似たものが必要でした。ここにいる:

#!/bin/bash

function process() {
while read line; do
    if [[ "$line" =~ ^Archive:\s*(.*) ]] ; then
        ar="${BASH_REMATCH[1]}"
        #echo "$ar"
    else
        if [[ "$line" =~ \s*([^ ]*abc\.jpg)$ ]] ; then
            echo "${ar}: ${BASH_REMATCH[1]}"
        fi
    fi
done
}


find . -iname '*.zip' -exec unzip -l '{}' \; | process

これで、ファイルを抽出して移動できる行を追加するだけです。正確に何をしたいのか分からないので、任せておきます。

答え2

あなたのUnixバージョンが以下をサポートしている場合ヒューズ(これはLinux、* BSD、OSX、およびSolarisの場合に当てはまります。)AVFSアーカイブに透明にアクセスします。このコマンドは、mountavfsファイルシステム全体のビューをルートとして生成します。~/.avfsここで、アーカイブファイルには、アーカイブ内のディレクトリとファイルを含む関連ディレクトリがあります。たとえば、foo.zip現在のディレクトリにある場合、次のコマンドはおおよそ次のようになりますunzip -l foo.zip

mountavfs    # needs to be done once and for all
find ~/.avfs$PWD/foo.zip\# -ls

したがって、現在のディレクトリのzipファイルに含まれているすべての画像を繰り返しコピーするには、次の手順を実行します/destination/directory(衝突した場合はプロンプトが表示されます)。

find ~/.avfs"$PWD" -name '*.zip' -exec sh -c '
    find "${0}#" -name "*.jpg" -exec cp -ip {} "$1" \;
' {} /destination/directory \;

zshから:

cp -ip ~/.avfs$PWD/**/*.zip(e\''REPLY=($REPLY\#/**/*.jpg(N))'\') /destination/directory

分解:~/.avfs$PWD/**/*.zip現在ディレクトリにあるzipファイルのAVFSビューに展開します。 glob修飾子は、eglobの出力を変更するために使用されます。各一致には…/*.zip(e\''REPLY=$REPLY\#'\')aのみが追加されます。#各一致をREPLY=($REPLY\#/**/*.jpg(N))ディレクトリのファイル配列に変換します。.jpg.zip#

答え3

私はあなたが最新バージョンのBashを持っていると仮定しているので、これを使うことができます:

shopt -s globstar
for path in topdir/**/*.zip
do
    unzip "$path" '.*abc.jpg'
done

答え4

仕事に行こう!残念ながら、既存の回答には、ここと他の場所ですべての種類の明白な方法で欠陥があります。人気の繰り返し

これ受け入れられた回答たとえば、Bashにのみ適用されます(その悪い)目的の検索パターンを1回の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。つまり、関数は最初に検索する正規表現を受け入れ、次に1つ以上のzipファイル名で構成される可変シーケンスを受け入れます。

もう一度申し上げますが、この機能はBashとzshでテストされました。上記のコードをまたはに追加すると、完全さと厳格さのためにできるだけ~/.bashrc素晴らしい~/.zshrczipファイルの栄光があなたのものになります。set -e

たとえば、それともそのようなことは起こりませんでした。

説明するために、次に含まれるすべてのクラスのセットを探してみましょう。I2PGentoo LinuxにインストールされているJARファイル名は7つの大文字で始まり、その後に1つの小文字が続きます。ただだから:

$ 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:

あなたはおそらくこれを手動で実行したくないでしょう。

関連情報