xcrun simctl deleteは、指定したシミュレータデバイスや、不要になったデバイスをまとめて削除するサブコマンドである。

基本的な使い方

deleteに続けてデバイスの名前かUUIDを指定する。

$ xcrun simctl delete "TIL Delete Test"

名前・UUIDのどちらでも削除できる。エラーがなければ何も出力されず、終了コードは0になる。

複数のデバイスを一度に削除する

デバイスを複数指定すると、まとめて削除できる。

$ xcrun simctl delete "TIL Multi A" "TIL Multi B"

同名デバイスが複数ある場合は1台しか消えない

デバイス名は一意である必要がなく、同じ名前のデバイスを複数作成できる(xcrun simctl createでiOSシミュレータデバイスを新規作成する を参照)。 このとき、名前を指定してdeleteを実行しても、同名デバイスのうち1台しか削除されない。

$ xcrun simctl list devices | grep "TIL Dup"
    TIL Dup (1E63A1EA-134B-4F62-8C1B-BDE96D45323D) (Shutdown)
    TIL Dup (ADDC8B06-00BF-4595-A5DB-9B5A48B188B8) (Shutdown)

$ xcrun simctl delete "TIL Dup"
$ xcrun simctl list devices | grep "TIL Dup"
    TIL Dup (1E63A1EA-134B-4F62-8C1B-BDE96D45323D) (Shutdown)

残った同名デバイスを削除するには、同じコマンドをもう一度実行する必要がある。 名前だけを頼りに同名デバイスをまとめて削除したい場合、1回の実行では消し切れない前提でスクリプトを組む必要がある。

存在しないデバイスを指定するとエラーになる

存在しない名前やUUIDを指定すると、Invalid deviceエラーになり終了コードが0以外になる。

$ xcrun simctl delete "Nonexistent Device"
Invalid device: Nonexistent Device

複数指定した中に無効なデバイスが混ざっている場合、コマンド全体はエラー終了するが、有効なデバイスの方は実際に削除される。

$ xcrun simctl delete "TIL Partial" "Nonexistent XYZ"
Invalid device: Nonexistent XYZ

$ xcrun simctl list devices | grep "TIL Partial"
(何も表示されない。エラーが出ていても"TIL Partial"は削除されている)

終了コードだけを見て全体が失敗したと判断すると、実際には一部のデバイスが削除されていることに気づかず、想定外の状態になる可能性がある。

不要なデバイスをまとめて削除する

unavailableを指定すると、現在のXcode SDKでサポートされていないデバイスをまとめて削除できる。 古いXcodeで使っていたランタイムを削除した後などに、参照先を失ったデバイス定義がUnavailableセクションに残り続けることがある。

$ xcrun simctl list devices | grep -c "unavailable"
50

$ xcrun simctl delete unavailable

$ xcrun simctl list devices | grep -c "unavailable"
0

実際に手元の環境で試したところ、iOS 15.5/16.0/16.4/tvOS 15.4/watchOS 8.5のランタイムを削除した後に残っていた50台のunavailableデバイスが、この1回のコマンドで一括削除された。 availableなデバイス(起動中のiPhone 17など)には影響しない。

全デバイスを削除するall

allを指定すると、unavailableかどうかを問わず全てのシミュレータデバイスを削除する。

$ xcrun simctl delete all

起動中のデバイスや普段の開発で使っているデバイスも含めて全て削除されるため、実行には注意が必要である。 本記事では影響範囲が大きすぎるため実行を見送った。