macOS の「Operation not permitted」を回避する【du/ls/mv/cp 実行時】【Mojave/Catalina 以降】

<h2>「Operation not permitted」で <code>du</code> しようもない</h2>

> Mac を **Mojave にしてからターミナルで [du](https://ja.wikipedia.org/wiki/Du_(Unix)) コマンドを実行すると「`du: 〜: Operation not permitted`」と表示される**ので `du` しようもないのです。
>
> <sup>2020/08/28 追記: Catalina でも同じ現象が出ました。</sup>

せやかて `sudo` でも同じで「`du` んだけ<ruby>〜<rt>⤴️</ruby>」とか思ってたら、`ls` `mv` `cp` `crontab` などの他のコマンドだけでなく Docker、VSCode でも出るので、チョイチョイ叱られるため困りました。

```shell-session:まずはエラーをCatalina
$ # ホームディレクトリ直下にあるサブディレクトリ容量の表示
$ sudo du -d 1 -h ~
Password:
（略）
du: /Users/admin/Library/Application Support/CallHistoryTransactions: Operation not permitted
du: /Users/admin/Library/Application Support/com.apple.TCC: Operation not permitted
du: /Users/admin/Library/Application Support/CallHistoryDB: Operation not permitted
du: /Users/admin/Library/IdentityServices: Operation not permitted
du: /Users/admin/Library/Messages: Operation not permitted
du: /Users/admin/Library/HomeKit: Operation not permitted
du: /Users/admin/Library/Mail: Operation not permitted
du: /Users/admin/Library/Safari: Operation not permitted
du: /Users/admin/Library/Suggestions: Operation not permitted
（以下省略）
```

<details><summary>検証環境と現象の完全ログ</summary><div>

```shell-session:検証環境
$ # 検証日
$ date
2019年 1月17日 木曜日 17時10分14秒 JST
$ 
$ # OSのバージョン
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.2
BuildVersion:	18C54
$
$ # du コマンドのバージョン
$ man du | tail -1 | sed -e 's/  */ /g'
BSD June 2, 2004 BSD
```

```shell-session:duコマンドでの現象
$ # ホームディレクトリで du の実行
$ sudo du -d 1 -h ~
Password:
3.8M	/Users/admin/Music
8.0K	/Users/admin/.docker
8.0K	/Users/admin/.local
  0B	/Users/admin/Pictures
6.0M	/Users/admin/.phpls
 54M	/Users/admin/Desktop
du: /Users/admin/Library/Application Support/CallHistoryTransactions: Operation not permitted
du: /Users/admin/Library/Application Support/com.apple.TCC: Operation not permitted
du: /Users/admin/Library/Application Support/CallHistoryDB: Operation not permitted
du: /Users/admin/Library/IdentityServices: Operation not permitted
du: /Users/admin/Library/Messages: Operation not permitted
du: /Users/admin/Library/HomeKit: Operation not permitted
du: /Users/admin/Library/Mail: Operation not permitted
du: /Users/admin/Library/Safari: Operation not permitted
du: /Users/admin/Library/Suggestions: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.VoiceMemos: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.Home: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.Safari: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.iChat: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.mail: Operation not permitted
du: /Users/admin/Library/Containers/com.apple.stocks: Operation not permitted
du: /Users/admin/Library/PersonalizationPortrait: Operation not permitted
du: /Users/admin/Library/Metadata/CoreSpotlight: Operation not permitted
du: /Users/admin/Library/Cookies: Operation not permitted
du: /Users/admin/Library/Caches/com.apple.safaridavclient: Operation not permitted
du: /Users/admin/Library/Caches/CloudKit/com.apple.Safari: Operation not permitted
du: /Users/admin/Library/Caches/com.apple.Safari: Operation not permitted
9.6G	/Users/admin/Library
200K	/Users/admin/.bash_sessions
  0B	/Users/admin/Public
  0B	/Users/admin/Movies
  0B	/Users/admin/Applications
  0B	/Users/admin/.Trash
326M	/Users/admin/Documents
147M	/Users/admin/Downloads
1.6M	/Users/admin/.cache
 10G	/Users/admin
```
```shell-session:同じディレクトリ階層の可視ファイル一覧
$ ls -lh ~/
total 0
drwx------@  3 admin  staff    96B  1 15 23:48 Applications
drwx------@ 56 admin  staff   1.8K  1 16 00:19 Desktop
drwx------@  9 admin  staff   288B  1 15 19:40 Documents
drwx------+  6 admin  staff   192B  1 17 13:05 Downloads
lrwxr-xr-x   1 admin  staff    32B  1 16 12:44 GitHub -> /Volumes/HDD_EXT_01/Git/GitHub
drwx------@ 63 admin  staff   2.0K  1 17 03:56 Library
drwx------+  3 admin  staff    96B  1 15 19:37 Movies
drwx------+  5 admin  staff   160B  1 15 22:27 Music
drwx------+  3 admin  staff    96B  1 15 19:37 Pictures
drwxr-xr-x+  4 admin  staff   128B  1 15 19:37 Public
lrwxr-xr-x   1 admin  staff    36B  1 16 16:50 Tests -> /Volumes/HDD_EXT_01/Data_Practices
```

</div></details>

[SIP](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%95%B4%E5%90%88%E6%80%A7%E4%BF%9D%E8%AD%B7) をいじるにしても `SIP` 返しが怖いし、High Sierra に戻すのも「めん `du`」なので Mojave て〜状態なのです。<sub><sup>... ... クドくてすみません 🙇‍♂️</sup></sub>
- [SIPをもっと深く知ってみよう！　〜SIPは一体何を保護しているのか〜](https://qiita.com/whitefox_105/items/0b70f7a504dcb72788e6)
- [初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)

[「`"Operation not permitted"` `mac` `mojave`」と Qiita 記事に絞ってググってみた](https://www.google.com/search?q=site:qiita.com+%22Operation+not+permitted%22+mac+mojave)ものの、ピンポイントで、まとまった情報がなかったので自分のググラビリティとして。

## TL; DR <sub><sup>（今北産業）</sup></sub>

1. デフォルトのセキュリティ設定がさらに厳しくなった（macOS Mojave, OSX 10.14 以降）
1. 実行ユーザー下のディレクトリ（ホームやゴミ箱など）であっても、ユーザーデータにアクセスするアプリは明示的に許可しないといけなくなった
1. システム環境設定で<font color=darkorange>**該当アプリにフルディスクアクセスを許可する**</font>必要があります（この場合「ターミナル」）

    | <img width="100%" alt="スクリーンショット 2019-01-17 17.25.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/78776/14feeda2-0201-970c-d7ec-a9580efb61c9.png"> |
    | :-- |
    | 「ターミナル」や「iTerm」アプリに限らず、<strong><font color=darkorange>ユーザ操作なくディスクアクセスがあるアプリは明示的に追加が必要</font></strong>です。例えば `crontab` の場合は `cron` コマンド本体、Docker Desktop の場合は `Docker.app` 、VSCode の場合は `Visual Studio Code.app` などです。 |

:::note warn
上記を試しても**ゴミ箱の「特定のファイル」だけが削除できない**場合、おそらく原因は別です。

<details><summary>にっちもさっちもゴミ箱が空にできない</summary>

ゴミ箱の特定のファイルが、どうにも `Operation not permitted` で削除できない場合があります。

OS は、処理に必要な一時的なファイル（ロック・ファイルなど）を作成することがありますが、処理後に削除されます。この時、**OS が後処理を行う前 or 行っている最中にユーザが重要なファイルをゴミ箱に移動してしまった**場合に、この現象が発生したりします。特に iCloud の同期中に大きなファイルなどの操作をした場合に<ruby>顕著<rt>けんちょ</rt></ruby>です。

例えば、USB に macOS イメージを焼いた後に OS インストール・アプリ（`Install_*.app`）を削除するも、ゴミ箱から削除できなくなった、などです。

おそらく削除できないファイルの<ruby>オーナー<rt>所有者</rt></ruby>が `root:wheel` になっており、`sudo chmod` でも変更できないと思います。その場合は、天下の `SIP` 返しを喰らわせて（一時的に無効にして）から削除する必要があります。

- [初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d) @ Qiita
- 起動時ショートカットのメモ（起動時のジャーンの直後に押下）
    - リカバリーモード: `⌘`(`command`) + `R` 押しっぱなし （<code><strong>R</strong>ecovery mode</code>）
    - セーフモード: <code><strong>S</strong>hift</code> 押しっぱなし （<code><strong>S</strong>afe mode</code>）

```text:エラーメッセージ
項目“macOS_HighSierra_10.13.6_install.app”が使用中のため、操作を完了できません。
```
```text:エラーメッセージ
一部の項目をスキップする必要があったため、操作を完了できません。各項目につき、“ファイル”＞“情報を見る”と選択し、“ロック”が選択解除されていることを確認してください。次に、“共有とアクセス権”セクションを確認してください。項目がロックされていないこと、および“読み出しのみ”または“アクセス不可”に指定されていないことを確認したら、やり直してください。
```

```shell-session:削除を試みるも失敗する
$ # 該当ファイルの確認 @ ゴミ箱
$ cd ~/.Trash && ls -lah
total 0
drwx------+  3 keinos  staff    96B  9 10 10:08 .
drwxr-xr-x+ 78 keinos  staff   2.4K  9 10 10:19 ..
drwxrwxrwx   3 keinos  staff    96B  6  4 09:46 macOS_HighSierra_10.13.6_install.app

$ # InstallESD.dmg が最初に削除に失敗している
$ sudo rm -rf ~/.Trash/*.app
Password:
rm: /Users/keinos/.Trash/macOS_HighSierra_10.13.6_install.app/Contents/SharedSupport/InstallESD.dmg: Operation not permitted
rm: /Users/keinos/.Trash/macOS_HighSierra_10.13.6_install.app/Contents/SharedSupport: Directory not empty
rm: /Users/keinos/.Trash/macOS_HighSierra_10.13.6_install.app/Contents: Directory not empty
rm: /Users/keinos/.Trash/macOS_HighSierra_10.13.6_install.app: Directory not empty
```

```shell-session:個別にファイルを削除しようとするも失敗する
$ cd ~/.Trash/macOS_HighSierra_10.13.6_install.app/Contents/SharedSupport

$ # ファイルのオーナーと権限を確認
$ ls -lah
total 9222688
drwxr-xr-x  3 keinos  staff    96B  6  4 09:48 .
drwxr-xr-x  3 keinos  staff    96B  6  4 09:48 ..
-rw-r--r--  1 root   wheel   4.4G  6  4 09:46 InstallESD.dmg

$ # オーナーの変更できず
$ sudo chown keinos:staff InstallESD.dmg
Password:
chown: InstallESD.dmg: Operation not permitted

$ # root に切り替えて削除するも失敗
$ sudo su

sh-3.2# whoami
root

sh-3.2# ls
InstallESD.dmg

sh-3.2# rm -rf InstallESD.dmg
rm: InstallESD.dmg: Operation not permitted
```


### 参考文献

- [Can't delete a file in the trash](https://discussions.apple.com/thread/253683447) @ discussions.apple.com
- [macOS Ventura doesn't let me delete "Install macOS Mojave.app"](https://discussions.apple.com/thread/254582106) @ discussions.apple.com


</details>

:::

:::note warn
上記を試してもインストールしたアプリが実行できない場合、問題は設置先にある可能性があります。

<details><summary>ニッチなアプリがどうにも実行できない</summary>

アプリやコマンドを、パッケージマネージャーでなくインストーラーを使ってインストールした場合、Linux/UNIX の古い習慣により macOS では許可されていないディレクトリにインストールされることがあります。

OS X 10.11 (El Capitan) 以降、SIP により<font color=darkorange>**システムの<ruby>要<rt>かなめ</rt></ruby>となるディレクトリ（`/System` `/usr` `/bin` `/sbin` `/var`）には任意のアプリを置けなくなりました**</font>。

さらに macOS 10.15 (Catalina) からは、これらの[システム・ディレクトリは読み取り専用のパーティション（ボリューム）に置かれる](https://applech2.com/archives/20190610-read-only-system-volume-apfs-refresh.html)こととなりました。つまり、マウントされた先に SIP を無効にしてプログラムを置いたとしても "Read-only file system" エラーが出るようになります。

任意のアプリは、基本的にユーザ・ディレクトリ（`~`）の下（例えば `~/Application` `~/Library` `~/.local` など）か、`/Applications` `/Library` `/usr/local` の下に置く必要があります。

- [About System Integrity Protection on your Mac](https://support.apple.com/en-my/102149) | Support @ apple.com

</details>

:::


## TS; DR <sub><sup><sub><sup>（なんか色々細かいこと）</sup></sub></sup></sub>

> 「システム環境設定」の「セキュリティとプライバシー」にある<strong>「フルディスクアクセス」に「ターミナル」アプリを追加して許可</strong>する。

- 手順

  - アップルメニュー → `[システム環境設定]` → `[セキュリティとプライバシー]` → `[プライバシー]` - `[フルディスクアクセス]` → `（鍵を解除）` → `「＋」ボタン押下` → 「アプリケーション」フォルダの「ユーティリティ」にある「ターミナル」を追加
  - <sub><sup><font color=red>【注意】</font>この作業の前に、ターミナルは終了していること</sup></sub>

macOS **Mojave（OSX 10.14）以降でセキュリティ設定がさらに厳しくなった**ため、セキュリティに関わるディレクトリ（ホームディレクトリなど）のファイルへアクセスするアプリは、たとえ `sudo` 付きであっても「`Operation not permitted`」が出るようになりました。これは、 `du` `ls` `mv` `cp` といった基本コマンドでも同じです。


### 設定変更後の出力結果

```shell-session:sudoなしでもOK
$ du -d 1 -h ~
3.8M	/Users/admin/Music
8.0K	/Users/admin/.docker
8.0K	/Users/admin/.local
  0B	/Users/admin/Pictures
6.0M	/Users/admin/.phpls
 55M	/Users/admin/Desktop
 10G	/Users/admin/Library
212K	/Users/admin/.bash_sessions
  0B	/Users/admin/Public
  0B	/Users/admin/Movies
  0B	/Users/admin/Applications
  0B	/Users/admin/.Trash
326M	/Users/admin/Documents
147M	/Users/admin/Downloads
1.6M	/Users/admin/.cache
 11G	/Users/admin
```

### 「`Permission denied`」と表示される場合

```shell-session
$ du -d 1 -h ~
du: ./.DocumentRevisions-V100: Permission denied
du: ./.TemporaryItems: Permission denied
du: ./.Trashes: Permission denied
```

`sudo` を付けて実行すれば大丈夫です。（要パスワード）

```shell-session
$ sudo du -d 1 -h ~
Password:
 36M	./.DocumentRevisions-V100
  0B	./.TemporaryItems
 12K	./.Trashes
```

## 所感

去年（2018 年）から Mac の HighSierra で空き容量が足りないと頻繁に注意されていたので、思い切って平成最後の OS クリーン・インストールをすることにしました。

その際、OS も同じく頻繁に勧められていた Mojave にアップグレードすることにしたのです。（OSX 10.13 → 10.14）

しかし、Xcode を除く最低限必要なアプリに絞ったのに、思った以上に空き容量が確保できません。「ゲームもしないし、データはクラウドに置いてるし」と、たかをくくって小容量の [MBP](https://ja.wikipedia.org/wiki/MacBook_Pro) を選択したツケが回ってきました。

そこで `du` コマンドで各サブディレクトリの容量を確認[^du]しようとしたところ、`du: <略>: Operation not permitted` のアクセス権エラーが乱発しました。

管理者アカウントでも NG で、`sudo` を付けても同じく NG でした。（記事上部の「検証環境と現象の完全ログ」参照）

HighSierra のころから、ディレクトリやファイルによっては「`Operation not permitted`」は表示されていたのですが、Mojave からユーザーのホームディレクトリ下でも表示されるようになりました。

「これは、シンボリック・リンクを張り間違えたの、か？」と心配になりましたが、特に問題は<ruby>なさげ<rt>・・・</rt></ruby>です。

色々触ってみると、どうやら Mojave 以降でセキュリティ設定がさらに厳しくなった印象を受けます。

となると、HighSierra の時のように `SIP`[^wiki] がらみの設定だと仮定すると厄介です。リカバリーモードで `csrutil disable` のターミナル操作などが必要[^sip]になるからです。

しかし、**新しく入れた OS に余計な設定はしたくありません**し、アプリの動作検証のために設定を元に戻すのも大変です。

それでも容量は確認しないといけないため、「下手に新たにアプリを入れるのもなぁ」と思って検索してみた[^search]ところ、英語でドンピシャの良質記事がありました[^fix]。助かりました。

> 「[Fix Terminal “Operation not permitted” Error in MacOS Mojave](http://osxdaily.com/2018/10/09/fix-operation-not-permitted-terminal-error-macos/)」@ OSXDaily


---

参考文献

[^searchqiita]: 「["Operation not permitted" mac mojave]()

[^search]: 「[`"Operation not permitted"` `mac` `mojave`](https://www.google.com/search?q=%22Operation+not+permitted%22+mac+mojave)」の検索結果 @ Google

[^sip]: 「[初心者向け　MacでOperation not permittedの解決方法](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)」@ Qiita

[^du]: 「[ディレクトリ以下のディスク容量を調べるduコマンド](https://qiita.com/ongaeshi/items/c064b22496844be69eaa)」@ Qiita

[^fix]: 「[Fix Terminal “Operation not permitted” Error in MacOS Mojave](http://osxdaily.com/2018/10/09/fix-operation-not-permitted-terminal-error-macos/)」@ OSXDaily

[^wiki]: 「[システム整合性保護（System Integrity Protection）](https://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%95%B4%E5%90%88%E6%80%A7%E4%BF%9D%E8%AD%B7)」@ Wikipedia