web-dev-qa-db-ja.com

サブフォルダなしで複数のファイルでZipを作成する方法は?

初期状況:

.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

私がする必要があること:

休閑構造を持つ必要があるd0、d1、d4を含むZipを作成したいと思います。

.
├── d0
├── d1
└── d4

私がすでに試したこと:

Zip myfiles d0 f1/d1 f2/f3/d4で試しました。しかし、これは元のフォルダ構造を保持しますが、これは私が望むものではありません。

.
├── d0
├── f1
│   └── d1
└── f2
    └── f3
        └── d4

質問サブフォルダーなしで複数のファイルを含むZipを作成する方法は?

11
eDeviser

手動で、Zipファイルを作成して更新できます。

Zip myfiles d0
(cd f1; Zip -u ../myfiles.Zip d1)
(cd f2/f3; Zip -u ../../myfiles.Zip d4)

括弧はサブシェルを作成し、cdの効果はサブシェルでのみ持続するため、元のディレクトリにcd戻す必要はありません。

d1d2などが実際にはファイルであり、ディレクトリ自体ではない場合、-jオプションを使用します。

-j
-ジャンクパス
保存したファイルの名前のみを保存し(パスをジャンク)、ディレクトリ名は保存しません。デフォルトでは、Zipはフルパス(現在のディレクトリからの相対パス)を保存します。

17
muru

findを使用してファイルリストを取得し、Zip -j myfilesを実行してパスを無視してそれらをパックできます。

find . -name "d[014]" -exec Zip -j myfiles {} +

$ tree
.
├── d0
├── f0
├── f1
│   └── d1
└── f2
    └── f3
        ├── d2
        ├── d3
        └── d4

$ find . -name "d[014]" -exec Zip -j myfiles {} +
  adding: d1 (stored 0%)
  adding: d4 (stored 0%)
  adding: d0 (stored 0%)

$ unzip -l myfiles.Zip
Archive:  myfiles.Zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-09 10:47   d1
        0  2017-10-09 10:48   d4
        0  2017-10-09 10:47   d0
---------                     -------
        0                     3 files

ただし、これはファイルに対してのみ機能します、ディレクトリはZip -jによって無視されます。これをディレクトリでも機能させるために、上記の例でd0d1およびf3ディレクトリ全体をパックしたい場合、find行はもう少し複雑になります:

$ find . \( -name "d[01]" -o -name "f3" \) -exec sh -c 'p=$(pwd); for i in $0 $@; do cd ${i%/*}; Zip -ur "$p"/myfiles ${i##*/}; cd "$p"; done' {} +
        Zip warning: /home/dessert/myfiles.Zip not found or empty
  adding: d1 (stored 0%)
  adding: f3/ (stored 0%)
  adding: f3/d3 (stored 0%)
  adding: f3/d2 (stored 0%)
  adding: f3/d4 (stored 0%)
  adding: d0 (stored 0%)
$ unzip -l myfiles.Zip 
Archive:  myfiles.Zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-10-11 10:18   d1
        0  2017-10-11 10:19   f3/
        0  2017-10-11 10:19   f3/d3
        0  2017-10-11 10:19   f3/d2
        0  2017-10-11 10:19   f3/d4
        0  2017-10-11 10:17   d0
---------                     -------
        0                     6 files
19
dessert

-jオプションを使用すると、ファイルからパスが削除されます。

Zip -j myfiles d0 f1/d1 f2/f3/d4 

参照

18
ravery