「圧縮解除」が事前に単一のフォルダを作成しているかどうかはどうすればわかりますか?

「圧縮解除」が事前に単一のフォルダを作成しているかどうかはどうすればわかりますか?

一般的な状況は、他のタスクを含むディレクトリにzipファイルを含めることです。

me@work ~/my_working_folder $ ls
downloaded.zip  workfile1  workfile2  workfile3

解凍したいのですが、downloaded.zip混乱を招くのか、それとも自分のディレクトリを素敵に作成するのかわかりません。私が取り組んでいる解決策は、一時フォルダを作成してそのフォルダに解凍することです。

me@work ~/my_working_folder $ mkdir temp && cp downloaded.zip temp && cd temp
me@work ~/my_working_folder/temp $ ls
downloaded.zip
me@work ~/my_working_folder/temp $ unzip downloaded.zip 
Archive:  downloaded.zip
   creating: nice_folder/

これにより、my_working_folderzipファイルが大量のコンテンツで埋められるのを防ぎます。

私の質問は次のとおりです解凍する前にzipファイルにフォルダが1つしか含まれていないことを確認するより良い方法はありますか?

ベストアンサー1

わかったできる無条件にサブディレクトリに抽出し、単一のエントリのみが含まれる場合は削除してください。

しかし、なぜ行くのですか?健全でシンプルなソリューション(頼るイルカチョ)、いつから使用できますかawk? :)

sunzip ()
{
    if [ $# -ne 1 ] || ! [ -f "$1" ]
    then
        printf '%s\n' "Expected a filename as the first (and only) argument. Aborting."
        return 1
    fi

    extract_dir="."

    # Strip the leading and trailing information about the zip file (leaving
    # only the lines with filenames), then check to make sure *all* filenames
    # contain a /.
    # If any file doesn't contain a / (i.e. is not located in a directory or is
    # a directory itself), exit with a failure code to trigger creating a new
    # directory for the extraction.
    if ! unzip -l "$1" | tail -n +4 | head -n -2 | awk 'BEGIN {lastprefix = ""} {if (match($4, /[^/]+/)) {prefix=substr($4, RSTART, RLENGTH); if (lastprefix != "" && prefix != lastprefix) {exit 1}; lastprefix=prefix}}'
    then
        extract_dir="${1%.zip}"
    fi

    unzip -d "$extract_dir" "$1"
}

速くて汚い。 InfoZIP unzipv6.0に適用されます。追加のパラメータを許可したり、自動的に使用したり、抽出サブディレクトリに別の名前(現在のファイル名で決定)を使用する
など、必要に応じてそれらを調整できます。unzipzip


ああ、この回避策が最も一般的な2つの場合(1. ZIPファイルにコンテンツを含むディレクトリが含まれている場合、2. ZIPファイルに複数の別々のファイルおよび/またはディレクトリが含まれている場合)は正しく処理されますが、ルートディレクトリが作成されないことを確認しました。 ZIPファイルには複数のディレクトリが含まれていますが、ファイルはありません。サブディレクトリは...

編集する:安定した。スクリプトawkはZIPファイルに含まれている各パスの最初のコンポーネント(「プレフィックス」)を保存し、以前のプレフィックスとは異なるプレフィックスが検出されるとすぐに中断されます。これは、すべてのコンテンツが同じサブディレクトリに含まれるZIPファイルを無視しながら、複数のファイルと複数のディレクトリ(両方とも名前が異なるため)をキャプチャします。

おすすめ記事