【Mac】ファイルの順番を維持した zip を作る

2020年2月26日

 hetima.com さんが公開されている、zip の内容を表示してくれる Quicklook プラグインを利用させてもらっている。

🔗 Releases · hetima/HetimaZip-qlgenerator · GitHub

 しかし最近、その表示がおかしくなってきた。これは HetimaZip のせいではなく、zip 圧縮のときファイル順がおかしくなっているのが原因らしい。

zip コマンドはファイルの順番がおかしい

 以下のようなファイルを内包する「images」というフォルダを zip ファイルにしてみる。
 最初の、コーヒーの画像が qlimage としてアイコンにプレビューされて欲しいのだが。

 このような zip ファイルが作成される。

 三番目の黄色い花の画像が一番上にきているのだ。
 zip コマンドのログを見ると、なぜか 3、2、1 の順番でファイルにしている。にゃんで?

zip -r ~/Desktop/images.zip ~/Desktop/images
  adding: Users/user/Desktop/images/ (stored 0%)
  adding: Users/user/Desktop/images/03_image.jpg (deflated 6%)
  adding: Users/user/Desktop/images/02_image.jpg (deflated 4%)
  adding: Users/user/Desktop/images/01_image.jpg (deflated 5%)

ls の結果を zip に渡す

 原因についてはよくわからない。なんか、順番にこだわらずに圧縮したほうが効率がいいのだろう。
 これをファイル順通りに圧縮するには、ls で表示したものを zip コマンドへ渡すというやり方が有用みたいだ。

ls -1 パス/ディレクトリ名 | zip -r -@ パス/圧縮ファイル名.zip

2020.2.26 追記
 これ間違いでした。ls にパスを渡すんじゃなく、cd で目的のディレクトリにいってから ls をしないと駄目みたいです。なので正確には、

cd パス/ディレクトリ
ls -1 | zip -r -@ パス/圧縮ファイル名.zip

が、正しいです。追記ここまで。

 ls のオプション「-1」は数字の 1 だ。
 このオプションで、ファイルやディレクトリを一行ずつ出力してくれる。

$ ls
01_image.jpg    02_image.jpg    03_image.jpg

$ ls -1
01_image.jpg
02_image.jpg
03_image.jpg

 zip コマンドの「-@」をつけると、ls の結果の順番通りに圧縮してくれる。

~$ cd Desktop/images
~/Desktop/images $ ls -1 | zip -r -@ ../images02.zip
  adding: 01_image.jpg (deflated 5%)
  adding: 02_image.jpg (deflated 4%)
  adding: 03_image.jpg (deflated 6%)

 想定通りコーヒーの画像がプレビューされて、とても満足。
 この方法は、下記サイトさまで教えてもらいました。

 ファイル名順にソートしてzipファイルを作成する