1Password CLIで添付ファイルがあるアイテムの一覧を取得するワンライナー

以下のワンライナーで1Password CLIコマンドを使って添付ファイルがあるアイテムの一覧を取得できる。

$ op item list --format=json | \
  op item get - --format=json | \
  jq -r 'select(.files != null) | [.vault.name, .title] | @tsv'

コマンドのポイント

op item list --format=json

opコマンドでは添付ファイルはop item getコマンドの結果で確認できる。
通常op item getコマンドはUUIDなどを指定して1件ごとに取得する。
しかし標準入力で所定のJSON形式のデータを受け取ることで複数のアイテムを取得できる。 そのop item list --format=jsonで全てのアイテムをJSON形式で取得できる。

この時点で以下のような出力となる。

[
  {
    "id": "",
    "title": "",
    "version": 1,
    "vault": {
      "id": "",
      "name": ""
    },
    (省略)
  },
  { "id": "", "title": "", "version": 1,
    "vault": {
      "id": "",
      "name": ""
    },
    (省略)
  },
  (省略)
]

op item get - --format=json

op item list --format=jsonコマンドで作成したJSON形式のデータを、 op item getコマンドの引数に-を指定して標準入力として受け取る。

このようにするとop item list --format=jsonコマンドで取得した全てのアイテムをop item getコマンドで取得できる。

次にjqコマンドで解析するために--format=jsonオプションをつけてJSON形式で出力する。

この時点では以下のようなJSONとなっている。

{
  "id": "",
  (省略)
}
{
  "id": "",
  (省略)
  "files": [
    {
      "id": "pbdc22jqtzgcpnggqnssb6rcsy",
      "name": "1Password Emergency Kit A3-993YVA-netreqscoltd.pdf",
      "size": 46137,
      "content_path": "/v1/vaults/ni5i5u5fcfgvpebenhxpimjvsy/items/dmkkbvybjnrx7ongo72aqtnxn4/files/pbdc22jqtzgcpnggqnssb6rcsy/content"
    }
  ]
  (省略)
}

添付ファイルがあるアイテムはfilesキーが存在する。

全体で1つのJSONとなっておらず、複数のJSONが連続している形で出力されているが後のjqコマンドではこの状態でもそのまま入力できるので問題ない。

jq -r 'select(.files != null) | [.vault.name, .title] | @tsv'

jqコマンドでJSON形式のデータを解析する。

filesキーが存在するアイテムのみを抽出するためにselect(.files != null)を使う。

保管庫名とタイトルのみを出力するために[.vault.name, .title]を指定し、@tsvを使ってタブ区切りで出力する。

最終的に以下のような出力となる。

保管庫名1  タイトル1
保管庫名1  タイトル2
保管庫名1  タイトル3
保管庫名2  タイトル4
保管庫名2  タイトル5

出力項目を変更する場合は、一旦op item get - --format=jsonまでの結果のJSONを見て出したい項目のキーを確認し、 [.vault.name, .title]の部分を変更する。

CSVで出力する場合は@tsvの代わりに@csvを指定する。

注意点

最初のop item list --format=jsonで全てのアイテムを取得するため、アイテムが多い場合は時間がかかる。
このコマンドの時点である程度絞れる場合は絞った方がよい。

例えばop item list --vault=保管庫名 --format=jsonのように保管庫を指定することで絞ることができる。
その他、op item list --helpでオプションを確認し、絞れるだけ絞ったほうがよい。