いくつかの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修飾子は、e
globの出力を変更するために使用されます。各一致には…/*.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
素晴らしい~/.zshrc
zipファイルの栄光があなたのものになります。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:
あなたはおそらくこれを手動で実行したくないでしょう。