どこからでも相対ディレクトリを保持しながら圧縮する

どこからでも相対ディレクトリを保持しながら圧縮する

から特定の機能を取得しようとしていますzip。特定のディレクトリ内のすべてを再帰的に zip 圧縮し、そのディレクトリ内のディレクトリ構造のみを保持したいのですが、完全修飾パスはアーカイブの一部にしません。

たとえば、そのフォルダー内からコマンドを実行しているかのように、/path/to/test/tmp/その中のすべてを zip 圧縮したいとします。tmp/

フラグ-rは私が望むものを取得しますが、実行する場所に応じて、必要なディレクトリの上のパス情報が含まれます。

user@MBP:~/path/to/test$ zip -r myarchive.zip tmp/
  adding: tmp/foo.txt (deflated 68%)
  adding: tmp/bar/bar.txt (deflated 41%)
  adding: tmp/baz/baz/baz.txt (deflated 92%)

この-jフラグはファイル名以外のすべてをカットします:

user@MBP:~/path/to/test$ zip -rj myarchive.zip tmp/
  adding: foo.txt (deflated 68%)
  adding: bar.txt (deflated 41%)
  adding: baz.txt (deflated 92%)

私が必要としているのは、次のものを提供してくれるものです:

adding: foo.txt (deflated 68%)
adding: bar/bar.txt (deflated 41%)
adding: baz/baz/baz.txt (deflated 92%)

しかし、どこからでも実行するように指定できます。これをcronにスクリプト化しようとしています。探しているものが見つかりませんマニュアルページスクリプト内のディレクトリを実際に変更する以外に、これを実現するにはどうすればよいでしょうか?

答え1

どうやらzip(少なくとも私のプラットフォームにある Info-ZIP のバージョンでは) それが許可されていないようです。( @Xen2050 が示唆したように、 /オプションtarがある とは異なります。)-C--directory

しかし、スクリプト内でディレクトリを変更するのはそんなに悪いことでしょうか?特に、サブシェル内で変更でき、スクリプトの現在の作業ディレクトリに影響を与えない場合(詳細はこのSOの回答で):

pwd
(cd /path/to/test/tmp; zip -r myarchive.zip .)
pwd    # prints the same as in line 1

これにより、最終的な Zip ファイルが に保存されることに注意してください/path/to/test/tmp

関連情報