Unix / Linuxでさまざまなzipレベルファイルを含む圧縮ファイルを解凍する方法は? [コピー]

Unix / Linuxでさまざまなzipレベルファイルを含む圧縮ファイルを解凍する方法は? [コピー]

たとえば、私のフォルダ名は テスト.zip

テスト.zip次のようなさまざまなzipフォルダが含まれています。te1.zip、te2.zip、te3.zip でもte1.zipさまざまなzipフォルダが含まれています。

だからすぐにLinuxで解凍する必要があります。

これを行う方法を教えてください。

答え1

このような短いスクリプトで作業を実行する必要があります(すべてを再帰的に処理するには、スクリプトが元のファイルを削除する必要があるため、元のファイルをバックアップする必要があります)。

while [ "$(find . -type f -name '*.zip' | wc -l)" -gt 0 ]; 
  do 
    find -type f -name '*.zip' -exec mkdir '{}'_dir \; \ 
                               -exec unzip -d '{}'_dir -- '{}' \; \
                               -exec rm -- '{}' \;
  done

-delete一部のシステムでは-exec rm -- '{}' \;

  • このコマンドは現在のディレクトリを繰り返します(このディレクトリはTest.zip(または保持しているすべてのzipファイル)のみが使用できる空のディレクトリであると予想されます)。
  • 見つかったアーカイブごとに、アーカイブ名+ _dirを使用して新しいディレクトリを作成します(一部のアーカイブに名前が一致するファイルが含まれている場合の競合を防ぎます)。
  • 新しく作成されたディレクトリにアーカイブを解凍し、処理されたzipファイルを削除します。
  • すべてのファイルが処理されたら、もう一度繰り返して、ディレクトリツリーでzipファイルを引き続き使用できることを確認します。
  • 内部のどこかにzip爆弾があると、スクリプトは無限ループに陥ります。

答え2

これは再帰スクリプトの素晴らしい候補です。

スクリプトとして保存(例えばmy_unzip.shそのままコマンドラインに貼り付けても機能しません。:

#!/usr/bin/env bash

: ${1:?Please supply a file} # ${1} is the zip being fed to the script -- a little user-friendliness never went amiss
DIR="${1%.zip}" # this is where the current zip will be unzipped
mkdir -p "${DIR}" || exit 1 # might fail if it's a file already
unzip -n -d "${DIR}" "${1}" # unzip current zip to target directory
find "${DIR}" -type f -name '*.zip' -print0 | xargs -0 -n1 "${0}" # scan the target directory for more zips and recursively call this script (via ${0})

実行可能にする

chmod +x my_unzip.sh

zipファイルを引数として実行します。

my_unzip.sh /some/path/yourfile.zip

進行状況を説明するインラインコメントで元のファイルをアーカイブします。

卑怯にも、すでに存在するものを上書きしようとしません。この動作は、更新unzipコマンドを介して削除したり-n、ヒントを取得したり、強制-o的に無視したりするように変更できます。

関連情報