macOS上で削除できないファイルのロックを解除する(ターミナルで)

WindowsmacOSを本格的に併用していた時期に気づいたのだが、Windowsで「読み取り専用」に設定したファイルは、macOSではロックされたファイルとして認識されるようだ。明示的にロックを解除しない限り、macOSのFinderでは削除できない。

Windowsでは誤ってファイルを編集してしまわないように「読み取り専用」に設定することがある。「読み取り専用」のファイルは普通のファイルとほぼ同様にそのまま削除できる(「読み取り専用」のフラグを解除する必要がない)。なので、運用上は特に問題にならない。

これが例えば「Windowsで『読み取り専用』のファイルをリムーバブルメディアにコピー→macOSに持っていく」なんてことをすると、macOS上でファイルを削除できずに慌てることになる。

ロックの解除はGUIでも可能だが、上記の状況ではロックされたファイルが大量にあったりする訳で、GUIで解除するのは面倒だ。普段からbash(1)で操作することが多いので、ターミナルで何とかしたい。

ロックの解除はchflags(1)で可能だが、コマンド名やオプションを忘れた頃にロックされたファイルに遭遇することが多いので、シェルスクリプト化しておくことにした。

#!/bin/sh
# -*- coding: utf-8-unix -*-
# vim:fileencoding=utf-8:ff=unix

PATH=/bin:/usr/bin

exec chflags -R nouchg "$@"

シェルスクリプト化したから、多分しばらくの間ロックされたファイルに遭遇することはないだろう。世の中そういうもの。

chflags(1)はmacOS固有のコマンドかと思ったが、どうもBSD由来のようだ。4.4BSDから追加されたファイルフラグ(パーミッションとは別に、ファイルの追加・変更禁止などを設定するフラグ)を操作するためのコマンドだった。

ということは、Windowsで「読み取り専用」に設定したファイルをFreeBSDOpenBSDに持っていった時にも同じような問題が起きるのだろうか?

終わりに

最終的には、こんな感じになった。

https://github.com/eel3/eel3-scripts/blob/master/bin/mac/removable