一般的な状況は、他のタスクを含むディレクトリに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_folder
zipファイルが大量のコンテンツで埋められるのを防ぎます。
私の質問は次のとおりです解凍する前に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 unzip
v6.0に適用されます。追加のパラメータを許可したり、自動的に使用したり、抽出サブディレクトリに別の名前(現在のファイル名で決定)を使用する
など、必要に応じてそれらを調整できます。unzip
zip
ああ、この回避策が最も一般的な2つの場合(1. ZIPファイルにコンテンツを含むディレクトリが含まれている場合、2. ZIPファイルに複数の別々のファイルおよび/またはディレクトリが含まれている場合)は正しく処理されますが、ルートディレクトリが作成されないことを確認しました。 ZIPファイルには複数のディレクトリが含まれていますが、ファイルはありません。サブディレクトリは...
編集する:安定した。スクリプトawk
はZIPファイルに含まれている各パスの最初のコンポーネント(「プレフィックス」)を保存し、以前のプレフィックスとは異なるプレフィックスが検出されるとすぐに中断されます。これは、すべてのコンテンツが同じサブディレクトリに含まれるZIPファイルを無視しながら、複数のファイルと複数のディレクトリ(両方とも名前が異なるため)をキャプチャします。