Unixでディレクトリを解凍する[閉じる]

Unixでディレクトリを解凍する[閉じる]

unzipUnixでフォルダを試してみました。

$ 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}。重要なデータが含まれていないディレクトリでこれを行うことをお勧めします。スクリプトにデータ破損のバグがあるかどうか疑問です。ただし、損傷した場合はすべての部分を維持することができます。

関連情報