圧縮と暗号は大事
匿名化に加えてこれら3つは3大PCリテラシーだと思います
パスワード付きPDF
ちょっとした書類ならコレで良いと思う
- プレビューで何らかをpdfを保存するときに
- 「アクセス権」→「書類を開くときにパスワードを要求」にチェック
- 専用パスワードを確実に打ちこむ
- 「アクセス権」の設定でさらに改竄防止を見込める
- 例外的な許可を出さずにパスワード設定すればおk
PDFの仕様なんてそうそう変わらんし,深くは追求しません,汎用性も低いでしょうし…
パスワード付きで圧縮・暗号
ちょっとしたデータならコレで良いと思う
基本的にFInderからGUI経由で行うことが無理な(オプションが呼び出せない)上に,macOSにデフォルトで入ってるアプリやコマンドは更新性や追従性に乏しく,これはhomebrew経由で外部のツールを導入した方が良いと思う
準備
とりあえずは基本のzip
・rar
・tar
を抑えておきたい
[https://formulae.brew.sh/formula/zip:embed:cite]
[https://formulae.brew.sh/formula/unzip:embed:cite]
[https://formulae.brew.sh/cask/rar:embed:cite]
えっunrar
ってつい最近ライセンス問題で公式から消えたらしいですよ
[https://qiita.com/shimizumasaru/items/7e57bb5c506c0ae4eb80:embed:cite]
[https://formulae.brew.sh/formula/gnu-tar:embed:cite]
※untar
は存在しない,動作は全部コマンドで決め打ちしているらしい
- 通常の
brew
環境が構築されてるintel macが前提- apple siliconでのhomebrewは色々とパスが違ってくるらしいけど知らん
- とりあえずRosetta2でやればいいんじゃないのか?
- apple siliconでのhomebrewは色々とパスが違ってくるらしいけど知らん
- コマンド設定
- 以下の順番を守って取得
brew install zip
brew install unzip
brew install rar
brew install carlocab/personal/unrar
brew install gnu-tar
- 以下の順番を守って取得
- パスを設定
-
rar
・unrar
はデフォルトで/usr/local/bin
にエイリアスが発生する -
tar
はgtar
として/usr/local/bin
にエイリアスがある -
zip
・unzip
はmacデフォルトと衝突すると厄介なことになるらしくエイリアスが生成されていない-
gzip
はgzip
として別にあるせいで名前が被ってるせいかもしれんね
-
- なので
/usr/local/opt/bin
を作ってパスに通した上で/usr/local/opt/[cask name]/bin/[cask command]
のシンボリックリンクを置く- ついでに同じように
tar
も置いとこう
mkdir /usr/local/opt/bin
ln -s /usr/local/opt/zip/bin/zip /usr/local/opt/bin/zip
ln -s /usr/local/opt/unzip/bin/unzip /usr/local/opt/bin/unzip
ln -s /usr/local/opt/gnu-tar/bin/gtar /usr/local/opt/bin/tar
echo export PATH='/usr/local/opt/bin:$PATH' >> ~/.bashrc
- ついでに同じように
- 私は
PATH = [application path]/usr/local/bin:/usr/local/opt/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
みたいにしてる - 各自のシェルの設定ファイルに合わせること,
zsh
なら~/zprofile
と~/.zshrc
になる-
bash
とzsh
の間なら複製して名前を変えるだけでも割と行けるっぽい…?
-
-
実行
zip
の場合
- 暗号
-
zip -A -o -r -n .zip:.bz2:.7z:.rar:.gz:.tgz -X -y -8 -e [zipped file path] [source file path]
- 例:
zip -A -o -r -n .zip:.bz2:.7z:.rar:.gz:.tgz -X -y -8 -e ~/Documents/Private/data.zip ~/Download/list
- 例:
- パスワード設定はダブルチェックされる
- オプションはそれぞれ,
-
-A
でWindows用の自己解凍.exe
ファイルが生成- つまりmacOSには関係ねぇ
-
-o
で出てくる.zip
の日付がディレクトリ内の日付の最新版に -
-r
で再帰処理にしてディレクトリに対応 -
-n [.extension 1]:[.extension num]
で2重圧縮を回避 -
-X
でファイルシステムの余計な情報を削除 -
-y
で参照先の外部ファイルの混入を阻止 -
-8
で圧縮強度を最大化 -
-e
で本体を暗号化
-
-
[zipped file path]
のファイル名はそのまま出てくるので末尾に.zip
を忘れないように
-
- 分割
-
zip -s [num][kmgt] [source file path] -O [zipped file path]
- 例:
zip -s 64k ~/Documents/Private/data.zip -O ~/Documents/Private/spirit.zip
- 例:
- 1発目の
.zip
生成の段階で分割しようとするとエラーを吐くのでNG -
[source file path]
ファイル名は.zip
じゃないと認識してくれないので注意 - パスワードチェックなし
- オプションはそれぞれ,
-
-s [num][k,m,g,t]
で分割サイズを指定,最低でも64kbyte
以上
-
-
- 結合
-
zip -s 0 [source file path] -O [zipped file path]
- 例:
zip -s 0 ~/Documents/Private/spirit.zip -O ~/Documents/Private/data2.zip
- 例:
-
-s 0
で1つの.zip
に還元される- 分割と結合を繰り返すとデータがバグるかもしれん
- パスワードチェックなし
-
[source file path]
には分割時の代表ファイル(.z[num]
じゃないもの)を指定する- もちろん例に漏れず
.zip
じゃないと認識してくれない
- もちろん例に漏れず
-
- 復号
-
unzip [source file path]
- 例:
unzip ~/Documents/Private/data2.zip
- 特定のファイル1つを解凍する場合は
unzip -p [source file path] > [unzipped file path]
で名前指定も可能-
-p
で出力をstdout
に指定してパイプ化しただけ
-
- 別のディレクトリに入れる場合は
unzip [source file path] -d [any directory path]
で押し込める-
-d
とその引数は必ず最後に置くこと
-
- 例:
- パスワードチェック必須
-
.zip
じゃなくても読み込んでくれる(中身がダメならダメと言ってくれる) - 名前がダブったファイルの強制上書き許可は
-o
・強制上書き禁止は-n
-
unzip -B [source file path]
すると上書きはせずにバージョン別(拡張子を含むファイル名の末尾に~[num]
)のバックアップが追加される- 解凍ファイルの内部の処理ではなく,解凍された中身が生成される該当のディレクトリに
- これ自体にバージョン管理機能はなく,やりたいなら番号をワイルドカードで全検索して抽出しろって感じか?
-
-o
するとそのバックアップすらも上書きできるので注意
-
- 先の通りmacOSでは自己解凍はできない
- アーカイブユーティリティがあるので心配ない
-
ここでは単純に圧縮と展開のやり方を示したが,本来はアーカイブ更新機能の側面が強く,元ディレクトリとのファイルの差分をとって更新して保存するやり方が一般的かもしれない.基本的に.zip
にはロックをかけずアップデートをかけ続ける,それを自動化して低リソースな環境で実行する…みたいな雰囲気を感じる.
そこらが関係するのか軽い気持ちで調べてたら想像以上に複雑だったし,私が望む「使える・壊れない・明かされない」という観点でもzip
よりrar
の方が良かったりする,そのためアーカイブ更新機能として使いこなすのはまた別の機会にしたい.
rar
の場合
- 暗号
rar a -k -r -ts- -s -ds -sfx -ma5 -m5 -hp [rarred file path] [source file path]
- 例
rar a -k -r -ts- -s -ds -sfx -ma5 -m5 -hp ~/Documents/Private/data.sfx ~/Download/list
- パスワード設定はダブルチェックされる
- オプションはそれぞれ,
-
a
でアーカイブ生成モードを指定 -
-k
でロックして再編集を不可能に -
-r
で再起処理にしてディレクトリに対応 -
-ts-
で時間系の情報を削除 -
-s
でソリッド圧縮を指定 -
-ds
で内部の名前順ソートを無効化 -
-sfx
で自己解凍実行ファイルを添付 -
-ma5
で新しい.rar
規格を使用 -
-m5
で圧縮強度を最大化 -
-hp
でヘッダごと本体を暗号化
-
-
-sfx
の場合は拡張子.sfx
が必ずつくが,ない場合は[rarred file path]
がそのまま出てくる
- 復号
-
unrar x [source file path]
- 自己解凍させたい場合は
./[source file path]
すると起動する,手順は変わらない - 特定のファイル1つを解凍する場合は
unrar p -iunl [source file path] > [unrarred file path]
で名前指定も可能-
-p
で出力をstdout
に指定した上で-inul
でデフォの出力を消さないとダメ
-
- 別のディレクトリに入れる場合は
unrar x [source file path] [any directory path+/]
で押し込める- パスの最後に
/
が入ってない場合は[source file path]
と見なされて処理されないので注意
- パスの最後に
- 自己解凍させたい場合は
- パスワードチェック必須
-
.rar
じゃなくても読み込んでくれる(中身がダメならダメと言ってくれる) - 名前がダブったファイルの強制上書き許可は
-o+
・強制上書き禁止は-o-
-
ロックと暗号化が行えるのが強みで,圧縮性・耐破性・暗号性もzip
より上,導入も楽で自爆解凍もできる,しかも文法が簡単で覚えやすい.現実では特に欧州で流行ってるらしく,実際に使っている人間は自分の周りでこそほぼ見たことがないものの,割と積極的に使いたい印象を受けた.もうこれだけでよくね?と言える程度には簡潔に完結していると思う.
zipに関する補記
homebrew
で入ってくるzip
は「16 June 2008 (v3.0)」かつunzip
は「unzip20 April 2009 (v6.0)」が最新版となっている.macOSにデフォルトで入っているzip
・unzip
も全く同じであり,要するにわざわざディレクトリを分けて管理しようとしたのは徒労であったということになる.さらに-Zb
はzip
できるがunzip
できない(以下の通りなら.zip
規格の対応が0.1だけunzip
の方が遅れているせいだと思われる)などのドボン選択肢もある.
% zip -rZb arc.zip test
% unzip arc.zip
... need PK compat. v4.6 (can do v4.5)
またzip
における「エントリ」とは「.zip
内にあるファイルもしくはディレクトリ」を指す.「エントリには65535個の制限があるほか,アーカイブのサイズにも4GBの制限がある」なる昔話があったらしいが.これはかつてのzip
が32bit動作をしているからであり,それを改善したzip64はその制限を超えられるようになった.
自分のzip
・unzip
がそれに対応しているかどうかについて,以下のように表示されれば対応の確認が取れる.
% zip -v | grep 64
... ZIP64_SUPPORT
% zip -v | grep 64
... ZIP64_SUPPORT
現在は/usr/bin/unzip
もzip64に対応しているようだが,アーカイブユーティリティ.appについてはmacOS Catalinaになるまで実装されなかったという目撃情報がある.
[https://taiyakon.com/2021/01/macos-version-zip64.html:embed:cite]
そもそもzip
・unzip
の公式サイトを見ても最新版がhomebrew
上の最新版やmacOSのデフォルト版と一致しており,
[http://infozip.sourceforge.net/:embed:cite]
これらはInfo-zip
という形で2009年までOSSで開発されていた,今後ここから新しくなることはないと考えて良さそう.
後継としてはzlib
とgzip
か,前者はzip
で培われた圧縮技術を各言語・各OSで利用可能にするライブラリで,後者はGNUの開発元でGPLライセンスで提供されるファイル圧縮用のツール,という認識で合っているのだろうか?
準備
rar
・zip
の代わりにbzip2
・gzip
・7zip
・lrzip
(・rzip
)を利用していく
[https://formulae.brew.sh/formula/gzip#default:embed:cite]
[https://formulae.brew.sh/formula/p7zip#default:embed:cite]
[https://formulae.brew.sh/formula/bzip2:embed:cite]
[https://formulae.brew.sh/formula/lrzip:embed:cite]
[https://formulae.brew.sh/formula/rzip:embed:cite]
- コマンド設定
- 以下を取得
brew install gzip
brew install p7zip
brew install bzip2
brew install lrzip
brew install rzip
- 以下を取得
- パスを設定
-
bzip2
はmacデフォルトと衝突すると厄介なことになるらしくエイリアスが生成されていない-
ln -s /usr/local/opt/bzip2/bin/bzip2 /usr/local/opt/bin/bzip2
しましょうね
-
- コレ以外は普通に
/usr/local/bin
に入ってくれる -
rzip
は使わないが,archlinux wikiにも載ってたので敬意を表して数字に貢献した-
lrzip
はrzip
の機能を利用した上でさらに色々と工夫したらしいな?
-
-
実行
以下は順に追記していきます
gzip
の場合
- 圧縮
gzip -k -9 -c [source file path] > [zipped file path]
-
[zipped file path]
のファイル名はそのまま出てくるので末尾に.gz
を忘れないように-
-c
と> [zipped file path]
がないと[source file path]
のファイル名に勝手に.gz
がつくけど
-
- オプションはそれぞれ,
-
-k
で元ファイルを削除しない -
-9
で圧縮強度を最大化 -
-c
でstdout
に指定
-
- ディレクトリを再帰的に辿る実装はなく,
tar
(後述)でまとめてからgzip
するのが正攻法- 引数に複数のファイルを並べると全て個別に
.gz
化されるのが特徴 -
gzip -k -9 -c [source file path1] > [zipped file path1] [source file path num] > [zipped file path num]
すれば良い-
[source file path1] [source file path num] > [zipped file path]
すると,.tar
同士だけなら最後に展開すればなんとかなるが,.tar
以外のファイルが混ざってると詰む -
man
のADVANCED USAGEは嘘こそ言ってないが,例えば画像ファイルの2つをgzip
してgunzip
すると元に戻らない,フォルダ構造を失った挙句それをrescueする方法がないから当然とも言えるが
-
- 引数に複数のファイルを並べると全て個別に
- 名前がダブったファイルの強制上書き許可は
-f
,なければ聞かれるまでもなく上書きされない
- 解凍
gzip2 -k -c [source file path] > [unzipped file path]
- オプションはそれぞれ,
-
-k
で元ファイルを削除しない -
-c
でstdout
に指定
-
- どうせファイルしか出てこないのでこれで覚えた方が良い
- 名前がダブったファイルの強制上書き許可は
-f
,なければ聞かれるまでもなく上書きされない -
gzip
を入れると勝手にgunzip
もついてくる- というより
gzip
を使う上で-z
で圧縮するか-d
で解凍するかの違いしかない
- というより
調べた限りではディレクトリ統合機能もパスワード暗号化機能もなさそう,やはり別ライブラリ(後述)を使うべきだろう.
--rsyncable
とは?
tar
+gzip
で保管されるファイルに対して,生成する際に--rsyncable
を用いてgzip
しておくことで,そのサーバに対してrsync
した際に得られるデータの差分の量そのものがカットできる(2016年のv1.7で実装されたらしい)
[https://superuser.com/questions/482758/rsync-friendly-gzip:embed:cite]
[https://translate.google.com/translate?hl=ja&sl=en&u=https://superuser.com/questions/482758/rsync-friendly-gzip&prev=search&pto=aue:embed:cite]
[https://beeznest.wordpress.com/2005/02/03/rsyncable-gzip/:embed:cite]
[https://beeznest-wordpress-com.translate.goog/2005/02/03/rsyncable-gzip/?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_pto=nui:embed:cite]
rsync -z
オプションでも圧縮が可能であるが,こちらは差分を取った後に転送するデータを圧縮するため,要するに2段構えの方が(マシンリソースあるなら)絶対に良いし,zip
に比べても大きな利点となる
gzip -r
・gunzip -r
の動作
この-r
は再帰的という意味を示すが,zip -r
は渡されたパスが示すディレクトリを基準として配下のディレクトリ・ファイルをまとめて1つの.zip
にする一方,gzip -r
では渡されたパスが示すディレクトリもしくはその配下のディレクトリにファイルがあればその場で1つずつ.gz
にしていく,同様に1つずつ.gz
から戻していくのがgunzip -r
である
p7zip
の場合
bzip2
の場合
- 圧縮
bzip2 -k -9 -c [source file path] > [zipped file path]
-
[zipped file path]
のファイル名はそのまま出てくるので末尾に.bz2
を忘れないように-
-c
と> [zipped file path]
がないと[source file path]
のファイル名に勝手に.bz2
がつくけど
-
- オプションはそれぞれ,
-
-k
で元ファイルを削除しない -
-9
で圧縮強度を最大化 -
-c
でstdout
に指定
-
- ディレクトリを再帰的に辿る実装はなく,
tar
(後述)でまとめてからbzip2
するのが正攻法- 引数に複数のファイルを並べると全て個別に
.bz2
化されるのが特徴-
bzip2 -k -9 -c [source file path1] > [zipped file path1] [source file path num] > [zipped file path num]
すれば良い -
[source file path1] [source file path num] > [zipped file path]
すると,.tar
同士だけなら最後に展開すればなんとかなるが,.tar
以外のファイルが混ざってると詰む -
gzip
とほぼ同じ理由か
-
- 引数に複数のファイルを並べると全て個別に
- 名前がダブったファイルの強制上書き許可は
-f
,なければ聞かれるまでもなく上書きされない
- 解凍
bunzip2 -k -c [source file path] > [unzipped file path]
- オプションはそれぞれ,
-
-k
で元ファイルを削除しない -
-c
でstdout
に指定
-
- どうせファイルしか出てこないのでこれで覚えた方が良い
- 名前がダブったファイルの強制上書き許可は
-f
,なければ聞かれるまでもなく上書きされない -
bzip2
を入れると勝手にbunzip2
もついてくる- というより
bzip2
を使う上で-z
で圧縮するか-d
で解凍するかの違いしかない
- というより
調べた限りではディレクトリ統合機能もパスワード暗号化機能もなさそう,やはり別ライブラリ(後述)を使うべきだろう.
lrzip
の場合
GPG
FireVault
Mac起動ディスクだけならコレで良いと思う
Windowsのbitlockerよりも優秀だと感じている
設定したら復旧キーを忘れないように必ずメモしておこう,iCloud連携は正直やりたくないなって…
外部のボリュームを暗号化
外付けストレージならコレで良いと思う
ディスクユーティリティでexFATフォーマットされたドライブの中にも問答無用で設定できる
veracrypt
Windows向けという印象があるがmacOSでも普通に使える
OSS開発でありながらも,これを使えば暗号化はかなり万全と考えて良さそうか…?