初期状況:
.
├── 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を作成する方法は?
手動で、Zipファイルを作成して更新できます。
Zip myfiles d0
(cd f1; Zip -u ../myfiles.Zip d1)
(cd f2/f3; Zip -u ../../myfiles.Zip d4)
括弧はサブシェルを作成し、cd
の効果はサブシェルでのみ持続するため、元のディレクトリにcd
戻す必要はありません。
d1
、d2
などが実際にはファイルであり、ディレクトリ自体ではない場合、-j
オプションを使用します。
-j
-ジャンクパス
保存したファイルの名前のみを保存し(パスをジャンク)、ディレクトリ名は保存しません。デフォルトでは、Zipはフルパス(現在のディレクトリからの相対パス)を保存します。
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
によって無視されます。これをディレクトリでも機能させるために、上記の例でd0
、d1
および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