1. 概要

Linuxでファイルを収集して圧縮する場合、 tar gzip xzなどの多くのオプションがあります。

ただし、WindowsまたはmacOSユーザーとファイルを共有する場合は、ZIP形式が最も簡単です。 私たちは彼らのためにそれを簡単に保ちたいと思っています。

このチュートリアルでは、紛らわしい余分なディレクトリを含まないアーカイブを作成する方法を調べます。 良好な経路衛生を実践します。 これは手作業で行うと簡単かもしれませんが、どこからでも呼び出すことができるスクリプトでは扱いにくい場合があります。

これを回避するために、bashシェルに組み込まれているプッシュおよびポップ機能を使用します。

2. -rですべてのものを圧縮する

友人やクライアントが送信したZIPファイルを抽出するときは、通常、基本的なディレクトリ構造を保持したいと考えています。 zipコマンドの-rオプションを使用してこれを行うことができます。

twinejs / src / vue ディレクトリ内のすべてと、その下にあるすべてを送信するとします。

~$ ls -R /home/allan/Source/twinejs/src/vue/
/home/a/Source/twinejs/src/vue/:
codemirror-theme.less  directives  index.less  mixins  transitions.less

/home/allan/Source/twinejs/src/vue/directives:
mouse-scrolling.js  mouse-scrolling.less

/home/allan/Source/twinejs/src/vue/mixins:
dom-events.spec.js  mount-to.js

これは、3つの異なるディレクトリにある一連のファイルです。 -r を使用して各ディレクトリに再帰する(ツリー内の各ディレクトリを圧縮する)と、次の出力が得られます。

~$ zip -r ~/twine-vue.zip /home/allan/Source/twinejs/src/vue
updating: home/allan/Source/twinejs/src/vue/ (stored 0%)
  adding: home/allan/Source/twinejs/src/vue/codemirror-theme.less (deflated 73%)
  adding: home/allan/Source/twinejs/src/vue/directives/ (stored 0%)
  adding: home/allan/Source/twinejs/src/vue/directives/mouse-scrolling.less (deflated 37%)
  adding: home/allan/Source/twinejs/src/vue/directives/mouse-scrolling.js (deflated 68%)
  adding: home/allan/Source/twinejs/src/vue/index.less (stored 0%)
  adding: home/allan/Source/twinejs/src/vue/mixins/ (stored 0%)
  adding: home/allan/Source/twinejs/src/vue/mixins/mount-to.js (deflated 31%)
  adding: home/allan/Source/twinejs/src/vue/mixins/dom-events.spec.js (deflated 69%)
  adding: home/allan/Source/twinejs/src/vue/transitions.less (deflated 63%)

しかし、私たちは彼らに道全体を送りたくありません。 それから私たちの友人はファイルにたどり着くためにいくつかのレベルを下がらなければならないでしょう。

ファイルを手動でアーカイブした場合、キャプチャするディレクトリ( vue との間で cd を実行できますが、スクリプトでは扱いにくいです。 それを回避するためのオプションまたはコマンドがあれば!

3. -jですべてのディレクトリをジャンクします

-j オプションは、ZIPファイルに追加されたすべてのファイルのディレクトリを「ジャンク」します。 これは、 basename toolのようなものです。ファイルの名前を保持し、ファイルへのパスにあるすべてのディレクトリを削除します。

それを試してみて、それが私たちが望むものに近いかどうかを確認してみましょう:

~$ zip -rj ~/twine-vue.zip /home/a/Source/twinejs/src/vue
  adding: codemirror-theme.less (deflated 73%)
  adding: mouse-scrolling.less (deflated 37%)
  adding: mouse-scrolling.js (deflated 68%)
  adding: index.less (stored 0%)
  adding: mount-to.js (deflated 31%)
  adding: dom-events.spec.js (deflated 69%)
  adding: transitions.less (deflated 63%)

正しくありません。 これを解凍すると、友人のDownloadsフォルダ全体にファイルが流出します。 cd に戻ったと思います—別の方法がない限り?

4. pushdおよびpopdより良い種類のcd

シェルの便利な機能であるpushdコマンドを使用すると、スクリプトの脆弱性を減らすことができます。このコマンドは、目的のディレクトリに移動し、開始した場所を追跡します。

4.1. pushd Our Way In

/ usr / local / bin からスクリプトを実行するときに、pushdをどのように使用するかを見てみましょう。

/usr/local/bin$ pushd /home/a/Source/twinejs/src/
~/Source/twinejs/src /usr/local

pushd は、2つのパス名を返します。1つは移動を要求した場所、次は現在の場所です。 それを使用して、指定したディレクトリに移動します。

これで、 vue のすぐ上のディレクトリに移動し、-rオプションを使用して圧縮できます。

~/Source/twinejs/src$ zip -r ~/twine-vue.zip vue/
  adding: vue/ (stored 0%)
  adding: vue/codemirror-theme.less (deflated 73%)
  adding: vue/directives/ (stored 0%)
  adding: vue/directives/mouse-scrolling.less (deflated 37%)
  adding: vue/directives/mouse-scrolling.js (deflated 68%)
  adding: vue/index.less (stored 0%)
  adding: vue/mixins/ (stored 0%)
  adding: vue/mixins/mount-to.js (deflated 31%)
  adding: vue/mixins/dom-events.spec.js (deflated 69%)
  adding: vue/transitions.less (deflated 63%)

私たちのZIPファイルの受信者が私たちの贈り物を彼らに抽出するとき、彼らはすべてを1つのディレクトリにきちんと入れます。

4.2. popd Out Again

そして、スクリプトが元の場所から取得したい場合は、 popd を実行して、開始した場所に戻ります。 これは現在または後で発生する可能性があります。どこにいても、最初にpushdを実行したディレクトリに戻ります。 (必要に応じて、これを複数のネストされた回数で実行することもできます!)

~/Source/twinejs/src$ popd
/usr/local/bin
/usr/local/bin$

そして、再び / usr / local / bin に戻り、ホームディレクトリに配置する場所にきちんと整理されたZIPファイルを残します。 スクリプトを続行できます。

5. 結論

この記事では、便利なシェル機能を利用して、ZIPアーカイブ内の不要な追加ディレクトリを回避します。

これは、このステップを自動化するためのよりクリーンな方法です。 また、整理されたZIPファイルを使用すると、受信者の生活が楽になります。