カテゴリー
Linux

zip コマンドで指定したファイルをディレクトリ構造を保ったまま圧縮する方法メモ!

ディレクトリ内の、指定したファイルをディレクトリ構造を保ったまま抜き出して圧縮する zip コマンドまとめ

# ディレクトリ構造を保ったまま任意のファイルを圧縮
zip -r test.zip dir1/ -i dir1/file1.txt dir1/dir2/file21.txt
  • コマンドを実行する場所に dir1 ディレクトリがある
  • -r オプションでファイルとディレクトリを再帰的に処理するように指定
  • test.zip は圧縮されて作成されるファイル
  • dir1/ は圧縮対象となるディレクトリ
  • -i オプションで指定したファイルのみを圧縮する
  • dir1/file1.txt と dir1/dir2/file21.txt が圧縮対象のファイル

このときの dir1 ディレクトリの中は、次のような構造ですので、指定したファイルのみが圧縮されているか否かを確認することができます。

.
`-- dir1
    |-- dir2
    |   |-- file21.txt
    |   |-- file22.txt
    |   `-- file23.txt
    |-- file1.txt
    |-- file2.txt
    `-- file3.txt

解凍して本当にディレクトリ構造を保ったまま圧縮できているか、確認します!

まずは解凍して既存のファイルを上書きしてしまわぬよう、新たにディレクトリを作り、そこに圧縮したファイルを移動します。

[root@localhost testdir]# mkdir after
[root@localhost testdir]# mv test.zip after/test.zip
[root@localhost after]#

ファイルの移動先へ自分も移動しまして、いよいよ解凍です♪

[root@localhost testdir]# cd after/
[root@localhost after]# unzip test.zip 
Archive:  test.zip
 extracting: dir1/dir2/file21.txt    
 extracting: dir1/file1.txt
[root@localhost after]#

解凍時のログからしまして、成功を予感させてくださいます♪解凍したディレクトリの中を確認します!

[root@localhost after]# tree dir1/
dir1/
|-- dir2
|   `-- file21.txt
`-- file1.txt

1 directory, 2 files
[root@localhost after]#

バッチリですわ♪zip コマンドを使って指定したディレクトリ内の、任意のファイルをディレクトリ構造を保ったまま抜き出して圧縮することができました♪

もうひとつ試します!フルパスで指定しますとどうなります?

小見出し通りです。フルパスで圧縮対象ディレクトリと -i オプションの圧縮対象ファイルを指定いたしますとどうなるでしょうか?

オプションを使用しない時は、フルパスで指定したディレクトリの最初からのディレクトリも含んだ状態で圧縮されます。使い勝手が悪く感じますので、ほとんどの場合、圧縮対象ディレクトリの場所に移動してから相対パスで指定しております。

それを踏まえますと、やはり記述したディレクトリ全てを圧縮するのではないかと予想いたしましたが、どうでしょうか?

[root@localhost testdir]# zip -r test.zip /tmp/testdir/ -i /tmp/testdir/dir1/file1.txt /tmp/testdir/dir1/dir2/file21.txt 
  adding: tmp/testdir/dir1/dir2/file21.txt (stored 0%)
  adding: tmp/testdir/dir1/file1.txt (stored 0%)
[root@localhost testdir]#

圧縮は成功しました。ログを見る限り、圧縮対象ファイルのある場所までのディレクトリ全てが含まれているように思えます。。。

[root@localhost testdir]# mv test.zip after/test.zip
[root@localhost after]# unzip test.zip 
Archive:  test.zip
 extracting: tmp/testdir/dir1/dir2/file21.txt  
 extracting: tmp/testdir/dir1/file1.txt
[root@localhost after]# tree tmp/
tmp/
`-- testdir
    `-- dir1
        |-- dir2
        |   `-- file21.txt
        `-- file1.txt

3 directories, 2 files
[root@localhost after]#

確かめてみますと、やっぱりファイルを指定するのに記述したディレクトリ全てが含まれていました。。。正直、こんなにもいらないです。

このような場合、わたくしは dir1 から欲しい場合がほとんですので、最初の相対パスでの指定方法がよい、と言えますわね♪

Error! 実現できなかった失敗例です♪

ここからは失敗例です><。

-r オプションを付けないで再帰的に処理をさせるようにしない場合ですと、失敗しました><。

[root@localhost testdir]# zip test.zip dir1/ -i dir1/file1.txt dir1/dir2/file21.txt 

zip error: Nothing to do! (test.zip)
[root@localhost testdir]#

ひょっとして、フルパスで指定すれば、場所は確実に特定できているわけですから -r オプションは不要?と思い試してみましたがそういう問題ではないようですの><。

[root@localhost testdir]# zip test.zip /tmp/testdir/ -i /tmp/testdir/dir1/file1.txt /tmp/testdir/dir1/dir2/file21.txt 

zip error: Nothing to do! (test.zip)
[root@localhost testdir]#

もうひとつ、圧縮対象ディレクトリだけフルパス、圧縮対象ファイルは相対パスですとどうなりますでしょうか?

これも、失敗です><。

[root@localhost testdir]# zip -r test.zip /tmp/testdir/dir1/ -i dir1/file1.txt dir1/dir2/file21.txt 

zip error: Nothing to do! (test.zip)
[root@localhost testdir]#

zip コマンドを使用する時は、フルパスと相対パスを混ぜないで、相対パスなら相対パスで統一、フルパスならばフルパスで統一して圧縮対象を指定することがコツ、なのだと思います。

最後に、本投稿を試すために、ディレクトリ、ファイルを作ったコマンドメモ♪

これは今後もう一度確かめたい時のために、ぱっとお試し用のディレクトリ、ファイルを作れるようにとの願いをこめてメモです。

[root@localhost tmp]# mkdir testdir
[root@localhost tmp]# cd testdir/
[root@localhost testdir]# mkdir dir1
[root@localhost testdir]# touch dir1/file1.txt
[root@localhost testdir]# touch dir1/file2.txt
[root@localhost testdir]# touch dir1/file3.txt
[root@localhost testdir]# mkdir dir1/dir2
[root@localhost testdir]# touch dir1/dir2/file21.txt
[root@localhost testdir]# touch dir1/dir2/file22.txt
[root@localhost testdir]# touch dir1/dir2/file23.txt
[root@localhost testdir]# tree
.
`-- dir1
    |-- dir2
    |   |-- file21.txt
    |   |-- file22.txt
    |   `-- file23.txt
    |-- file1.txt
    |-- file2.txt
    `-- file3.txt

2 directories, 6 files
[root@localhost testdir]#

おわりに

ひとつのプログラムファイルを修正します。開発環境から、本番環境へリリースします。ファイルは1つだけですので、そのファイルだけ転送すればよいですよね♪

また、このディレクトリに含まれているもの全部圧縮したい、という場合も zip コマンドに -r オプションを付ければ簡単に実現できます。

では、好きなファイルをいくつか指定して、しかもディレクトリ構造を保ったまま圧縮するにはどうすればよいでしょうか?一気に難しくなりますわね。。。

そのようなことを試してみたくなり、今回の投稿へとつながりました。コマンドについて調べるにあたり、オプションをある程度網羅しております次のページがとても参考なりました。ありがとう存じます。

今回のようなケースではどのオプションを使うとよいのでしょう?あ!きっと -i ですの!あと、-r もかしら?などとお買い物で選んでいる時のような楽しさがございました♪

楽しかったですの♪

以上です。

「zip コマンドで指定したファイルをディレクトリ構造を保ったまま圧縮する方法メモ!」への1件の返信

コメントを残す