unzip
Unixでフォルダを試してみました。
$ unzip sample.zip
これはルート構造を作成することですa/b/c/d/e/f/sample
。
unzip
現在のディレクトリにフォルダが必要です。
答え1
unzip(1)
マニュアルページから:
-j junk paths. The archive's directory structure is not recreated;
all files are deposited in the extraction directory (by default,
the current one).
答え2
完全な階層なしでフォルダを解凍する
フォルダのある階層を保持せずにzipファイルからディレクトリの内容を解凍しようとすると、幸運ではありません。この機能を提供する方法はありません。問題はzipファイルが生成される方法です。彼らは一般的に硬い塊で作られているので、ほとんどの人が考えるのと同じくらい近づきにくいです。
私が見たこれを行うことができる唯一の2つの方法は、次のようにzipファイルインデックスを繰り返すループを作成することです。
方法1
for i in $(unzip -l zipfile.zip); do
# look for specific location
# when there, make directory structure you want
# unzip zipfile.zip $i -d /some/tmp/dir
# move file from /some/tmp/dir to new directory
done
上記の作業は、Perl、Pythonなどのさまざまなプログラミング言語で完了できます。
方法#2
別の方法は、zipファイルのコピーを作成し、ツールを使用してzipnote
アーカイブ内のファイルインデックスを操作し、zipファイルのインデックスを操作してファイルを抽出することです。
完全な階層でフォルダを解凍する
一方、zipファイルから単一のフォルダを抽出したい場合は、次のコマンドを使用できます。
$ unzip "/path/to/archive.zip" "in/archive/folder*" -d "/path/to/unzip/to"
はい
サンプルディレクトリ構造。
$ tree
.
|-- 1
| |-- 2
| | |-- 3
| | | `-- 4
| | | `-- 5
| | | |-- file1
| | | |-- file2
| | | |-- file3
| | | |-- file4
| | | `-- file5
| | `-- afile
| `-- afile
`-- afile
ジッパーを持ち上げます。
$ zip -r ../afile.zip .
adding: afile (stored 0%)
adding: 1/ (stored 0%)
adding: 1/afile (stored 0%)
adding: 1/2/ (stored 0%)
adding: 1/2/afile (stored 0%)
adding: 1/2/3/ (stored 0%)
adding: 1/2/3/4/ (stored 0%)
adding: 1/2/3/4/5/ (stored 0%)
adding: 1/2/3/4/5/file1 (stored 0%)
adding: 1/2/3/4/5/file2 (stored 0%)
adding: 1/2/3/4/5/file3 (stored 0%)
adding: 1/2/3/4/5/file5 (stored 0%)
adding: 1/2/3/4/5/file4 (stored 0%)
zipファイルの内容を確認してください。
$ unzip -l ../afile.zip
Archive: ../afile.zip
Length Date Time Name
--------- ---------- ----- ----
0 11-07-2013 16:43 afile
0 11-07-2013 16:43 1/
0 11-07-2013 16:43 1/afile
0 11-07-2013 16:43 1/2/
0 11-07-2013 16:43 1/2/afile
0 11-07-2013 15:51 1/2/3/
0 11-07-2013 15:51 1/2/3/4/
0 11-07-2013 15:51 1/2/3/4/5/
0 11-07-2013 15:51 1/2/3/4/5/file1
0 11-07-2013 15:51 1/2/3/4/5/file2
0 11-07-2013 15:51 1/2/3/4/5/file3
0 11-07-2013 15:51 1/2/3/4/5/file5
0 11-07-2013 15:51 1/2/3/4/5/file4
--------- -------
0 13 files
これで、フォルダー5のみを解凍します。
$ unzip afile.zip "1/2/3/4/5*" -d new/
Archive: afile.zip
creating: new/1/2/3/4/5/
extracting: new/1/2/3/4/5/file1
extracting: new/1/2/3/4/5/file2
extracting: new/1/2/3/4/5/file3
extracting: new/1/2/3/4/5/file5
extracting: new/1/2/3/4/5/file4
減圧確認:
$ tree .
.
`-- 1
`-- 2
`-- 3
`-- 4
`-- 5
|-- file1
|-- file2
|-- file3
|-- file4
`-- file5
答え3
アーカイブを一時的な場所に解凍し、ファイルを現在のディレクトリに移動して少し迂回する方法で実行できますが、これを直接行うことはできないようです。
これ質問zipファイルの内容の構造を実際に理解していないため、解決するのが難しいということです。通常の状況では。あなたが望むものが最初のディレクトリコンポーネントを「ゴミ処理」し、その下のすべてを現在のディレクトリに入れることであれば、シェルスクリプトまたはシェル関数を書くことでこれを行うことができます。 GNU bashを使った例を見てみましょう。他のシェルを好むなら、他のシェルに適応することは難しくありません。 ~/.bashrc の末尾に置いてみてください。
unzip_to_current_dir() {
zipfilenames="$@"
for zipfilename in ${zipfilenames}; do
tempdir=$(mktemp -d)
unzip -d "${tempdir}" "${zipfilename}"
mv "${tempdir}/*/*" ./
rm -rf "${tempdir}"
done
}
アイデアはzipファイル名を取得し、一時ディレクトリを1つずつ作成し、そのディレクトリに解凍し、解凍されたターゲットディレクトリの最初のレベルのサブディレクトリ内のすべてのエントリを現在のディレクトリに移動し、移動する前に一時ディレクトリをクリーンアップします。です。次のファイルに。これにより、zipファイルからパスの最初のコンポーネントが効果的に削除されるため、a / abc、a / bcd、a / cde、a / def / ghiを含むzipファイルを解凍すると、これらのファイルが./abc、a/ bcd、a/cde、a/def/ghi./bcd、./cde、./def/ghi。
これが好きなように機能するかどうかを簡単にテストするには、最もインデントされた4行を選択し、一度に1行ずつ手動で実行して自分の値のみを変更します${zipfilename}
。重要なデータが含まれていないディレクトリでこれを行うことをお勧めします。スクリプトにデータ破損のバグがあるかどうか疑問です。ただし、損傷した場合はすべての部分を維持することができます。