libarchive の bsdtar
の組み合わせで および GNU tar
、これらのネストされたアーカイブの内容を、ディスクに展開することなく一覧表示できます:
for f in *.zip; do
bsdtar -cf - --include='*.zip' "@$f" | tar -xf - --to-command='bsdtar tvf -'
done
GNU tar
--to-command
による抽出時に、アーカイブのメンバーをコマンドにパイプできます ただし、tar
のみをサポートします アーカイブ形式。
bsdtar
tar
以外のあらゆる種類のアーカイブ形式をサポート 1 つ (zip
を含む) ones)、GNU tar
に相当するものはありません の --to-command
(AFAIK) ですが、その場でアーカイブ形式を変換できます。
サブフォルダーのトップ ファイルを実際に解凍しないと、これを行うことはできません。
このようなもの:
set -e
for f in *.zip
do
n=`basename -- "${f}" .zip`
mkdir -- "${n}"
cd -- "${n}"
unzip ../"${f}"
for p in *.zip
do
unzip -l -- "${p}"
done
cd ..
rm -rf -- "${n}"
done
おそらく ${n}
かどうかを確認する必要があります 既に存在し、存在する場合はエラーを生成します。サブディレクトリに一時的なファイル名を使用することもできます:
dir=`mktemp -d zip-files.XXXXXX`
次に cd "${dir}"
を実行します と rm -rf "${dir}"
アップデート:
set -e
何か問題が発生した場合にスクリプトが停止するようにするために使用されます。特に mkdir -- "${m}"
の場合 失敗、cd -- "${m}"
も失敗するため、cd ..
rm -rf -- "${n}"
が間違ったディレクトリ レベルに移動します。
cd ..
を作る別の方法 for
の前にそのディレクトリを記憶する方が安全です。 ループしてそのパスを次のように使用します:
topdir=`pwd`
for ...
do
...
cd "$topdir" # instead of `cd ..`
...
done
そうすれば rm -rf -- "${n}"
$topdir
でのみ動作します .
一時ディレクトリを使用すると、一番上の zip ファイルのファイル名が何であれ、ディレクトリの作成/削除が期待どおりに機能するため、物事がより安全になります。
GNU Parallel がインストールされている場合:
extract_list() {
mkdir "$1"
cd "$1"
unzip ../"$1".zip
parallel unzip -l ::: *.zip
cd ..
rm -rf "$1"
}
export -f extract_list
parallel extract_list {.} ::: *.zip