全力で怠けたい

怠けるために全力を尽くしたいブログ。

cron の構文をちょいちょい忘れるので基本的なとこだけメモしておく。

cron の構文をちょいちょい忘れるので基本的なとこだけメモしておく。

cron の構文

一番基本的なやつ

一番基本的なやつ。

  • 5つのフィールドをスペースで区切って指定する
  • フィールドは左から分・時・日・月・曜日を指定する

指定できる範囲はこんな感じ。フィールドによって 0 始まりだったり 1 始まりするので気にしておく。

フィールド 範囲
0-59
0-23
1-31
1-12 または JAN-DEC
曜日 0-6 または SUN-SAT

演算子

フィールドは時刻を表す数値だけじゃなくていくつかの演算子が使える。

演算子 説明
* 任意の値 * * * * * 毎日、毎分実行する
, 値リストの区切り文字 2,10 4 * * * 毎日、午前4時2分と午前4時10分に実行する
- 値の範囲 0 4-6 * * * 毎日、午前4時0分、午前5時0分と午前6時0分に実行する
/ ステップ値 20/15 * * * * 毎日、20分から59分までの間で15分おきに実行する (20分、35分、50分)

実行する時間の書き方の例

実行する日時 フィールドの記載 説明
毎分 * * * * * 毎分実行する
2分ごと */2 * * * * 2分ごとに実行する
1時間ごと 0 * * * * 1時間ごとに0分に実行する
2時間ごと 0 */2 * * * 2時間ごとに0分に実行する
10時から17時までの範囲で1時間ごと 0 10-17 * * * 10時から17時の間は1時間ごとに0分に実行する
毎日 0 0 * * * 毎日0時0分に実行する
2日ごと 0 0 */2 * * 2日ごとに0時0分に実行する
日曜日 0 0 * * SUN 日曜日の0時0分に実行する
平日 0 0 * * MON-FRI 月曜日から金曜日の間は0時0分に実行する
毎月 0 0 1 * * 毎月1日の0時0分に実行する
2ヶ月ごと 0 0 1 */2 * 2ヶ月ごとに1日の0時0分に実行する

参考サイト

AWS CLI の S3 のファイルの --exclude と --include の使い方のメモ。

AWS CLIaws s3 sync とか aws s3 cp コマンドとかの --exclude オプションと --include オプションの使い方のメモ。

aws コマンドのバージョン。

$ aws --version
aws-cli/2.1.21 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

--exclude オプションと --include オプションの使い方

AWS CLIaws s3 sync とか aws s3 cp コマンドはパスを指定する引数は UNIX スタイルのワイルドカードは使えないけど --exclude オプションと --include オプションを使うと UNIXワイルドカードとだいたい同じことができる。

--exclude オプションと --include オプションは雰囲気で使ってるけど少しひっかかりがあったので軽く調べてみたのをメモしておく。

このあとのコマンドの実行でのローカルのディレクトリとファイル構成はこんな感じでやっていく。

ファイル名が a, ab, bc のやつがそれぞれ .csv, .txt の拡張子と組み合わせたファイルを配置している。

$ tree ./data
./data
├── a.csv
├── a.txt
├── ab.csv
├── ab.txt
├── b.csv
├── b.txt
├── c.csv
└── c.txt

パターン記号

--exclude オプションと --include オプションは UNIXワイルドカードみたいなパターン記号が使える。

--exclude オプションと --include オプションが使えるパターン記号と意味はこんな感じ。

パターン記号 意味
* 任意の文字列にマッチする
? 任意の1文字にマッチする
[sequence] sequence の任意の1文字にマッチする
[!sequence] sequence にない任意の1文字にマッチする

パターン記号をいくつか試してみる。

--exclude '*' を指定してすべてのファイルを除外する。

$ aws s3 sync --dryrun --exclude '*' ./data s3://alice-s3-bucket/data

--exclude '*.csv' を指定して拡張子が .csv のファイルを除外する。

$ aws s3 sync --dryrun --exclude '*.csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

--exclude '?.csv' を指定して拡張子が .csv でベースが任意の1文字のファイルを除外する。

$ aws s3 sync --dryrun --exclude '?.csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

--exclude '[ab].csv' を指定して拡張子が .csv でベースが ab のファイルを除外する。

$ aws s3 sync --dryrun --exclude '[ab].csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.csv to s3://alice-s3-bucket/c.csv
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

--exclude '[!ab].csv' を指定して拡張子が .csv でベースが a でも b でもないファイルつまり c.csv を除外する。

$ aws s3 sync --dryrun --exclude '[!ab].csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.csv to s3://alice-s3-bucket/a.csv
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.csv to s3://alice-s3-bucket/b.csv
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

--exclude オプションと --include オプションの適用ルール

--exclude オプションと --include オプションの指定はいくつかルールがある。それぞれのルールの説明をメモしておく。

  • --exclude オプションと --include オプションはそれぞれ0回または1回以上指定できる
  • --exclude オプションと --include オプションは後に指定するほうが優先する
  • --exclude オプションと --include オプションはソースディレクトリに対して評価する
  • --include オプションは --exclude オプションと組み合わせて使う

それぞれ0回または1回以上指定できる

--exclude オプションと --include オプションはそれぞれ0回または1回以上指定できる。

--exclude '?.csv' を指定すると拡張子が .csv でベースが任意の1文字のファイルを除外するけど --exclude '?.csv' --exclude '?.txt' みたいに指定すると拡張子が .txt でベースが任意の1文字のファイルも除外する。

$ aws s3 sync --dryrun --exclude '?.csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

$ aws s3 sync --dryrun --exclude '?.csv' --exclude '?.txt' ./data s3://alice-s3-bucket
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt

後に指定するほうが優先する

--exclude オプションと --include オプションは後に指定するほうが優先する後勝ちルール。

後勝ちルールは名前のとおりで --exclude オプションの指定と --include オプションの指定の両方にマッチするファイルがあるときは後に指定するほうのルールが優先するルール。

たとえば --exclude '*' --include 'a.txt' みたいに指定すると、評価の順番は --exclude '*' にマッチするファイルつまりすべてのファイルを除外する => --include 'a.txt' にマッチする a.txt は除外せずに含めるという順番に評価するので、 a.txt だけが aws s3 sync コマンドの処理対象になる。

$ aws s3 sync --dryrun --exclude '*' --include 'a.txt' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt

--exclude--include を指定する順番を入れ替えて --include 'a.txt' --exclude '*' みたいに指定すると、評価の順番は --include 'a.txt' にマッチする a.txt は除外せずに含める => --exclude '*' にマッチするファイルつまりすべてのファイルを除外する順番に評価するので、aws s3 sync コマンドの処理対象のファイルはない。

$ aws s3 sync --dryrun --include 'a.txt' --exclude '*' ./data s3://alice-s3-bucket

後勝ちルールは --exclude--include を組み合わせるときに意味が出てくるルールで --exclude だけあるいは --include だけを組み合わせるときは別に気にしなくていい。

ソースディレクトリに対して評価する

--exclude オプションと --include オプションはソースディレクトリに対して評価する。

理解しやすくするのにローカルのディレクトリとファイル構成はこんな感じにしてみる。

$ tree ./data
./data
├── a.txt
├── b.txt
├── c.txt
└── child
    ├── a.txt
    ├── b.txt
    └── c.txt

--exclude '[ab].txt' を指定するとソースディレクトリ直下の a.txtb.txt は除外するけど child サブディレクトリ配下の a.txtb.txt は除外しない。

$ aws s3 sync --dryrun --exclude '[ab].txt' ./data s3://alice-s3-bucket
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
(dryrun) upload: data/child/a.txt to s3://alice-s3-bucket/child/a.txt
(dryrun) upload: data/child/b.txt to s3://alice-s3-bucket/child/b.txt
(dryrun) upload: data/child/c.txt to s3://alice-s3-bucket/child/c.txt

--exclude '[ab].txt' --exclude '*/[ab].txt' を指定するとソースディレクトリ直下の a.txtb.txt だけじゃなくて child サブディレクトリ配下の a.txtb.txt も除外する。

$ aws s3 sync --dryrun --exclude '[ab].txt' --exclude '*/[ab].txt' ./data s3://alice-s3-bucket
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt
(dryrun) upload: data/child/c.txt to s3://alice-s3-bucket/child/c.txt

--include オプションは --exclude オプションと組み合わせて使う

AWS CLIaws s3 sync とか aws s3 cp コマンドはデフォルトですべてのファイルが処理対象なので --include オプションだけを指定するとすべてのファイルが処理対象になる。

たとえば以下はすべて同じ結果になる。

$ aws s3 sync --dryrun ./data s3://alice-s3-bucket
$ aws s3 sync --dryrun --include '*' ./data s3://alice-s3-bucket
$ aws s3 sync --dryrun --include '*.csv' ./data s3://alice-s3-bucket

--include オプションだけを指定しても意味がなくて --include オプションは --exclude オプションと組み合わせて使うことによって効果が発揮する。

よく使うやつ

自分がよく使う --exclude オプションと --include オプションの使い方を書いていく。

特定のファイル以外を処理するときは --exclude オプションで特定のファイルを除外する。たとえば拡張子が .csv 以外のファイルを処理するときは --exclude '*.csv' を指定して拡張子が .csv のファイルを除外する。

$ aws s3 sync --dryrun --exclude '*.csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/a.txt
(dryrun) upload: data/ab.txt to s3://alice-s3-bucket/ab.txt
(dryrun) upload: data/b.txt to s3://alice-s3-bucket/b.txt
(dryrun) upload: data/c.txt to s3://alice-s3-bucket/c.txt

特定のファイルだけ処理するときは --exclude '*' ですべてのファイルを除外してから --include オプションで特定のファイルを含める。たとえば拡張子が .csv のファイルだけを処理するときは --exclude '*' --include '*.csv' を指定してすべてのファイルを除外してから拡張子が .csv のファイルだけを含める。

$ aws s3 sync --dryrun --exclude '*' --include '*.csv' ./data s3://alice-s3-bucket
(dryrun) upload: data/a.csv to s3://alice-s3-bucket/a.csv
(dryrun) upload: data/ab.csv to s3://alice-s3-bucket/ab.csv
(dryrun) upload: data/b.csv to s3://alice-s3-bucket/b.csv
(dryrun) upload: data/c.csv to s3://alice-s3-bucket/c.csv

参考サイト

Route 53 で取得してるドメインの連絡先情報を変更したメモ。

Route 53 で取得してるドメインの連絡先情報を変更したメモ。

Route 53 のドメインの連絡先情報を変更した

AWS からドメインの連絡先情報を確認してくれメールが来た

少し前のことだけど AWS から [Action required] Confirm that contact information for <登録してるドメイン> is correct の件名のメールが来た。

自分は Route 53 で .net ドメインを取得しててそのドメインの連絡先情報を確認してくれというメールのようでメールの本文はこんな感じ。

Dear AWS customer,

This message is a reminder to help you keep the contact information for your domain registration up to date. Our records include the following information:

Domains:
<登録してるドメイン>

<登録してる連絡先の情報>

If any of the contact information is inaccurate, open the Amazon Route 53 console and make corrections:
https://console.aws.amazon.com/route53/home#DomainDetail:<登録してるドメイン>

If your information is accurate, you do not need to take any action.

    Important
    Under the terms of your registration agreement, providing false WHOIS information can be grounds for the cancellation of your domain name registration.

Regards, 
Amazon Route 53

ざっくりの意味は「ドメイン登録の連絡先の情報が最新の状態か確認してね。連絡先情報が正しくなかったら修正してね」と「虚偽の連絡先情報を登録するとドメイン名の登録を取り消すことがあるよ」みたいな感じ。

自分が Route 53 でドメインを取得したのはちょうど1年と少し前だったけど連絡先情報が最新かどうかのリマインダーメールを受け取るのは今回が初めてだった。 実は少し思い当たることがあって、自分は少し前に引っ越しをしていて各種サービスに登録している住所たとえば AWS の請求先住所とかは変更していたけど Route 53 に登録している住所は変更していなかったけど、なんとなく Route 53 は1年ごととか定期的にリマインダーメールを送ってるだけのような気がする。

あとで会社の人に聞いたのだけど某レジストラは毎日のように「連絡先の情報が正しいか確認してね」メールを送ってくるらしい。おそろしい……

やったこと

Route 53 に登録しているドメインの連絡先の情報を現住所に変更した。

やったのは Route 53 の管理コンソールで取得してるドメインを表示と連絡先の情報を変更して 保存 ボタンを押すだけ。 保存 ボタンを押すとスクショを取り忘れたけど「連絡先の変更はレジストラが変更内容を確認するまで反映しないから少し待ってね。レジストラが変更内容を確認したらメールするよ」みたいなメッセージが表示する。 実際にちょっと前に変更した連絡先の情報を表示してみたけど変更前の情報が表示しているのが確認できた。

10分くらいすると AWS から Updating domain details for <登録してるドメイン> succeeded の件名のメールが来た。

Dear AWS customer,

We recently received an online request from your AWS account to make the following change:

<変更した連絡先>

If you requested this change, you don't need to take any further action.
If you did not request this change, please contact Amazon Web Services Customer Support immediately.

Regards, 
Amazon Route 53

ざっくりの意味は「ドメイン登録に関して変更のリクエストを受け付けたよ。もしアナタが変更をリクエストしたなら特にやってもらうことはないよ」と「もしアナタが変更をリクエストしてないならすぐにカスタマーサポートに連絡してね」という感じ。 今回は自分が変更をリクエストしているので特にすることはなくてドメインの連絡先情報の変更はこれで完了したっぽい。

S3 バケットとローカルのディレクトリを同期する AWS CLI の aws s3 sync コマンドの初歩的な使い方のメモ。

S3 バケットとローカルのディレクトリを同期する aws s3 sync コマンドの初歩的な使い方のメモ。

aws コマンドのバージョン。

$ aws --version
aws-cli/2.1.21 Python/3.7.4 Darwin/19.6.0 exe/x86_64 prompt/off

aws s3 sync コマンドの初歩的な使い方

aws s3 sync コマンドは S3 バケットとローカルのディレクトリを同期する便利なコマンド。

S3 バケットとローカルのディレクトリの同期だけじゃなくて任意の S3 バケットプリフィックス間でオブジェクトを同期したり S3 バケット間のオブジェクトを同期することもできる。

初歩的な使い方だけどたまに「あれ、どうやるんだっけ」みたいなのをメモしておく。

このあとのコマンドの実行でのローカルのディレクトリとファイル構成はこんな感じでやっていく。

$ tree ./data
./data
├── a.txt
└── hoge
    ├── a.txt
    └── fuga
        ├── a.txt
        └── b.txt

2 directories, 4 files

基本的な使い方

aws s3 sync <同期元> <同期先> みたいに使う。

同期元と同期先はそれぞれローカルならローカルのディレクトリのパスを指定するし S3 バケットなら S3バケットプリフィックスを指定する。

たとえば同期元がローカルの /home/alice/data で同期先が S3 の alice-s3-bucket バケットdata プリフィックスだったらこんな感じにやる。

$ aws s3 sync /home/alice/data s3://alice-s3-bucket/data

同期元が S3 の alice-s3-bucket バケットdata プリフィックスで同期先がローカルの /home/alice/data だったらこんな感じにやる。

$ aws s3 sync s3://alice-s3-bucket/data /home/alice/data

同期元が S3 の alice-s3-bucket バケットdata プリフィックスで同期先が S3 の alice-s3-bucket バケットdata2 プリフィックス だったらこんな感じにやる。

$ aws s3 sync s3://alice-s3-bucket/data s3://alice-s3-bucket/data2

--dryrun オプション: dry run する

--dryrun オプションを指定すると dry run する。

実際にはファイルやオブジェクトは同期せずに「こんな感じにファイルをアップロードしたりコピーしたり削除するよ」を表示する。

$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt
(dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt
(dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt
(dryrun) upload: data/hoge/fuga/b.txt to s3://alice-s3-bucket/data/hoge/fuga/b.txt

--delete オプション: 削除を同期する

aws s3 sync コマンドは同期元にないファイルが同期先にあるときは同期先のファイルはそのままで削除はしない。

--delete オプションを指定すると同期元にないファイルが同期先にあるときは同期先のファイルを削除する。

$ rm data/a.txt

$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data

$ aws s3 sync --dryrun --delete ./data s3://alice-s3-bucket/data
(dryrun) delete: s3://alice-s3-bucket/data/a.txt

--quiet オプション: 出力を抑制する

aws s3 sync コマンドはファイルやオブジェクトに対する操作を表示するけど --quiet オプションを指定するとファイルやオブジェクトに対する操作は表示しない。

$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt
(dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt
(dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt
(dryrun) upload: data/hoge/fuga/b.txt to s3://alice-s3-bucket/data/hoge/fuga/b.txt

$ aws s3 sync --dryrun --quiet ./data s3://alice-s3-bucket/data

--exclude: ファイルやオブジェクトを同期から除外する

--exclude オプションを指定するとファイルやオブジェクトを同期から除外する。

--exclude オプションを指定しないときは a.txt は3ファイルが同期する。

$ aws s3 sync --dryrun ./data s3://alice-s3-bucket/data | grep a.txt
(dryrun) upload: data/a.txt to s3://alice-s3-bucket/data/a.txt
(dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt
(dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt

--exclude オプションで a.txt を指定すると ./data/a.txt が同期から除外する。

$ aws s3 sync --dryrun --exclude a.txt ./data s3://alice-s3-bucket/data | grep a.txt
(dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt
(dryrun) upload: data/hoge/fuga/a.txt to s3://alice-s3-bucket/data/hoge/fuga/a.txt

--exclude a.txt みたいにすると ./data 直下の a.txt だけが同期から除外するけど --exclude '*a.txt' みたいにするとすべての a.txt を同期から除外する。

$ aws s3 sync --dryrun --exclude '*a.txt' ./data s3://alice-s3-bucket/data | grep a.txt

--include: ファイルやオブジェクトを同期から除外しない

--include オプションを指定するとファイルやオブジェクトを同期から除外しない。

--include オプションは --exclude オプションと組み合わせて使う。たとえば --exclude '*a.txt' するとすべての a.txt は同期から除外するけど --exclude '*a.txt' --include hoge/a.txt すると ./data/hoge/a.txt は同期から除外せずにちゃんと同期する。

$ aws s3 sync --dryrun --exclude '*a.txt' ./data s3://alice-s3-bucket/data | grep a.txt

$ aws s3 sync --dryrun --exclude '*a.txt' --include hoge/a.txt ./data s3://alice-s3-bucket/data | grep a.txt
(dryrun) upload: data/hoge/a.txt to s3://alice-s3-bucket/data/hoge/a.txt

ヘルプを見る

aws s3 sync help を実行するとヘルプが表示する。

自分は AWS CLI のヘルプはブラウザーマニュアル を読んじゃうので aws s3 sync helpブラウザーが使えないときくらいしか使わない気がする。

$ aws s3 sync help

SYNC()                                                                  SYNC()



NAME
       sync -

DESCRIPTION
       Syncs  directories  and S3 prefixes. Recursively copies new and updated
       files from the source directory to the destination. Only creates  fold-
       ers in the destination if they contain one or more files.

       See 'aws help' for descriptions of global parameters.

# (省略)

参考サイト

iTerm2 のコピーモードのキーボード操作のチートシート。

iTerm2 のコピーモードはキーボードで範囲を指定してコピーできるのが便利なのでメモ。

このメモは Build 3.4.2 で動作を確認している。

チートシートは最後に記載しているのでチートシートだけ見たいときはそちらを見てほしい。

iTerm2 のコピーモード

iTerm2 は コピーモード があって iTerm2 をコピーモードにするとキーボードで範囲を指定してコピーできるのがかなり便利なのでメモしておく。

iTerm2 のコピーモードはキーボードでカーソルを移動することができる。 vim ライクなキー操作でもカーソルを移動することができるので vim を使ったことがある人はすぐにコピーモードを使いこなせそう。個人的にはコピーモードを使う前はマウスで範囲を選択とコピーしててそんなに不自由はないように感じていたけど、コピーモードを使ってみたらカーソルの移動はコピーモード + キーボードでやるほうがかなり楽なように感じる。

コピーモードの開始と終了

メニューから Edit > Copy ModeCommand - Shift - c. 一応、マウスで範囲選択した状態で Shift - 矢印キー でコピーモードを開始することもできる。

コピーモード中は Escq でコピーモードを終了する。 あるいは Ctrl - c, Ctrl - g でもコピーモードを終了する。

基本的なカーソル移動

コピーモード中は矢印キーでカーソルを移動する。

あと vim ライクに h, j, k, l でカーソル移動することができる。

キー アクション
←, h 左に移動
↓, j 下に移動
↑, k 上に移動
右, l 右に移動

コピー範囲の選択とコピーの実行

Ctrl - v で矩形選択を開始。矩形選択中にカーソルを動かすとカーソルを動かした分が選択する。 矩形選択中に Ctrl - v で矩形選択を終了。

Spacev で文字選択を開始。文字選択中にカーソルを動かすとカーソルを動かした分が選択する。文字選択中に Spacev で文字選択を終了。

V で行選択を開始。行選択中にカーソルを動かすとカーソルを動かした分が選択する。行選択中に V を押すと行選択を解除。

文字、矩形か行を選択しているときに Ctrl - ky を押すと選択しているものをコピーする。

あと Ctrl - Space を押すと選択を終了する。

単語の移動

カーソルは Option - ←Shift - Tabb を押すと1つ前の単語に移動して Option - →Tabw を押すと1つ先の単語に移動する。 これらのキーはどれも記号は単語の区切りとして扱う。

たとえばカーソルが andnd 上にあるときに b を押すとカーソルは anda に移動して、カーソルが orangeo の上にあるときに b を押すとカーソルは apple,, に移動する。

apple, orange and banana

あとカーソルは B を押すと1つ前の単語に移動して W を押すと1つ先の単語に移動する。 これらのキーはどれも記号は単語の一部分として扱う。

たとえばカーソルが andnd 上にあるときに B を押すとカーソルは anda に移動して、カーソルが orangeo の上にあるときに B を押すとカーソルは apple,a に移動する。

apple, orange and banana

行の移動

カーソルは 0 を押すと行頭に移動して $ を押すと行末に移動する。あとカーソルは ^Option - m を押すと行頭かインデントの開始位置に移動して Enter (Return) を押すとカーソルが次の行の行頭に移動する。

0^ は行頭が印刷できない文字で始まっているときの動きが違う。

たとえばカーソルが バージョンを表示します 上にあるときに 0 を押すとカーソルは行頭つまり1つ上の行の OPTIONO の下の位置に移動するけど、 ^ を押すとカーソルは --version- に移動する。

OPTIONS:
  --version, -v             バージョンを表示します

その他のカーソル移動

g を押すとカーソルがバッファの先頭に移動して G を押すとカーソルがバッファの最後に移動する。

Ctrl - bPage Up を押すとカーソルが1画面分上に移動して Ctrl - fPage Down を押すとカーソルが1画面分下に移動する。

あと H, M, L を押すとそれぞれカーソルが可視領域の一番上か真ん中か一番下に移動する。

チートシート

コピーモードの開始、終了、コピー範囲の選択とコピーの実行。

キー アクション
Ctrl - Space 選択を終了する
Ecs, q, Ctrl - c, Ctrl - g コピーモードを終了する
Ctrl - v 矩形選択を開始する。矩形選択中は矩形選択を終了する
Space, v 文字選択を開始する。文字選択中は文字選択を終了する
V 行選択を開始する。行選択中は行選択を終了する

基本のカーソル移動。

キー アクション
←, h 左に移動
↓, j 下に移動
↑, k 上に移動
右, l 右に移動

コンテンツベースのカーソル移動。

キー アクション
Option - ←, Shift - Tab, b 記号は単語の区切りとして扱って1つ前の単語に移動する
Option - →, Tab, w 記号は単語の区切りとして扱って1つ前の単語に移動する
B 記号は単語の一部分として扱って1つ前の単語に移動する
W 記号は単語の一部分として扱って1つ前の単語に移動する
[ 1つ前のマークに移動する
] 1つ後のマークに移動する

行の移動。

キー アクション
^, Option-m 行頭かインデントの開始位置に移動する
0 行頭に移動する
$ 行末に移動する
Enter, Return 次の行の先頭に移動する

その他のカーソル移動。

キー アクション
g バッファの先頭に移動する
G バッファの最後に移動する
Ctrl - b, Page Up 1画面分上に移動する
Ctrl - f, Page Down 1画面分下に移動する
H 可視領域の一番上に移動する
M 可視領域の真ん中に移動する
L 可視領域の一番下に移動する

その他のコマンド。

キー アクション
o 選択範囲の反対側に移動する
Ctrl - k, y 選択しているものをコピーする

参考サイト

ユーザー ID とグループ ID を表示する id コマンドのメモ。

ユーザー ID とグループ ID を表示する id コマンドの使い方のメモ。

このメモは ubuntu 20.10 の Docker コンテナ上の id コマンドを使っている。

$ docker container run --rm -it ubuntu:20.10 /bin/bash

id コマンドのバージョン。

$ id --version
id (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Arnold Robbins and David MacKenzie.

id コマンドの使い方

id コマンドはユーザー ID とグループ ID を表示するコマンド。

自分は普段そんなに使わなくて使うときになって使い方を調べたりすることがたまにあるので使い方をメモしておく。

--help オプション: ヘルプ

--help オプションを指定すると id コマンドの使い方を表示する……んだけど man id が使えないときにしか使わない

$ id --help
Usage: id [OPTION]... [USER]...
Print user and group information for each specified USER,
or (when USER omitted) for the current user.

  -a             ignore, for compatibility with other versions
  -Z, --context  print only the security context of the process
  -g, --group    print only the effective group ID
  -G, --groups   print all group IDs
  -n, --name     print a name instead of a number, for -ugG
  -r, --real     print the real ID instead of the effective ID, with -ugG
  -u, --user     print only the effective user ID
  -z, --zero     delimit entries with NUL characters, not whitespace;
                   not permitted in default format
      --help     display this help and exit
      --version  output version information and exit

Without any OPTION, print some useful set of identified information.

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/id>
or available locally via: info '(coreutils) id invocation'

オプションなし

id コマンドはオプションなしで実行すると id コマンドを実行したユーザーのユーザー ID、ユーザーの名前、ユーザーが所属するすべてのグループ ID とグループの名前を表示する。

$ id
uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees)

$ whoami
alice

$ groups
alice employees

ちなみに SUID 属性とか SGID 属性が id コマンドに付与しているとこんな感じで実ユーザー ID、実グループ ID と実効ユーザー ID と実効グループ ID をすべて表示する。

# /home/alice/id
uid=0(root) gid=0(root) euid=1000(alice) egid=1001(alice) groups=1001(alice)

-u, --user オプション: 実効ユーザー ID を表示する

-u オプションか --user オプションを指定すると実効ユーザー ID (effective ID) を表示する。

$ id --user
1000

-u オプションか --user オプションと一緒に -n オプションか --name オプションを指定するとユーザーの ID の代わりにユーザーの名前を表示する。 このときの表示は whoami コマンドを実行するときの表示と同じ。

$ id --user --name
alice

$ whoami
alice

-g, --group オプション: 実効グループ ID を表示する

-g オプションか --group オプションを指定すると実効グループ ID を表示する。

$ id --group
1001

-g オプションか --group オプションと一緒に -n オプションか --name オプションを指定するとグループの ID の代わりにグループの名前を表示する。

$ id --group --name
alice

-G, --groups オプション: ユーザーが所属するすべてのグループ ID を表示する

-G オプションか --groups オプションを指定するとユーザーが所属するすべてのグループ ID を表示する。

$ id --groups
1001 1000

-G オプションか --groups オプションと一緒に -n オプションか --name オプションを指定するとグループの ID の代わりにグループの名前を表示する。 このときの表示は groups コマンドを実行するときの表示と同じ。

$ id --groups --name
alice employees

$ groups
alice employees

-n, --name オプション: ID の代わりに名前を表示する

-n オプションか --name オプションを指定すると ID の代わりに名前を表示する。

-n オプションと --name オプションは単独で指定することはできなくて以下のオプションと一緒に使っていく。

  • -u オプションか --user オプション
  • -g オプションか --group オプション
  • -G オプションか --groups オプション

-r, --real オプション: 実効ユーザー ID の代わりに実ユーザー ID を表示する

id コマンドはデフォルトは 実効ユーザー ID と実効グループ ID を表示するけど -r オプションか --real オプションを指定すると実効ユーザー ID と実効グループ ID の代わりに実ユーザー ID と実効グループ ID を表示する。

ちょっと分かりにくい気がするので id コマンドをコピーして SUID 属性と SGID 属性をコピーした id コマンドに付与してから実行してみる。

まずユーザー alice が id コマンドをコピーして SUID 属性と SGID 属性をコピーした id コマンドに付与していく。 chmod ug+s で SUID 属性と SGID 属性を id コマンドに付与してから ls コマンドを実行すると id コマンドのパーミッションrwxr-xr-x => rwsr-sr-x に変わっているのが確認できる。

$ whoami
alice

$ pwd
/home/alice

$ cp /usr/bin/id .
$ ls -l ./id
-rwxr-xr-x 1 alice alice 47632 Dec 30 06:04 ./id

$ chmod ug+s ./id
$ ls -l ./id
-rwsr-sr-x 1 alice alice 47632 Dec 30 06:04 ./id

su - で root になってから /home/alice/id コマンドを実行するとユーザー ID とグループ ID はそれぞれ実効ユーザー ID の alice と実効グループ ID の alice が表示するけど、 --real オプションを指定して /home/alice/id コマンドを実行するとユーザー ID とグループ ID はそれぞれ実ユーザー ID の root と実グループ ID の root が表示する。

$ su -
# whoami
root

# /home/alice/id --user --name
alice
# /home/alice/id --group --name
alice

# /home/alice/id  --user --name --real
root
# /home/alice/id --group --name --real
root

あと id コマンドをオプションなしで実行すると実ユーザー ID、実グループ ID と実効ユーザー ID と実効グループ ID をすべて表示する。

# /home/alice/id
uid=0(root) gid=0(root) euid=1000(alice) egid=1001(alice) groups=1001(alice)

-z, --zero オプション

id コマンドはデフォルトでは区切り文字は空白だけど -z オプションか --zero オプションを指定すると NULL 文字を区切り文字にする。 あと実行例の最終行が aliceemployees$ みたいになってて id --groups --name --zero の表示のあとに改行がなくてすぐプロンプトが表示している。

$ id --groups --name
alice employees

$ id --groups --name --zero
aliceemployees$

-z オプションと --zero オプションはデフォルトの表示フォーマットでは指定できないので --user オプションとか --group オプションとかと組み合わせて指定していく。

$ id --zero
id: option --zero not permitted in default format

-Z, --context オプション

-Z オプションか --context オプションを指定するとセキュリティコンテキストを表示する。

SELinux が無効な環境で実行するとこんな感じに表示するよう。

$ id --context
sysadm_u:sysadm_r:sysadm_t:s0

SELinux が無効な環境で実行するとこんな感じに表示する。

$ docker container run --rm -it ubuntu:20.10 /bin/bash

$ id --context
id: --context (-Z) works only on an SELinux-enabled kernel

-a オプション: 他のバージョンとの互換性のためにあるオプション

-a オプションは他のバージョンとの互換性のためだけにあるオプションで指定しても id コマンドの動作は一切変わらない。

$ id
uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees)
$ id -a
uid=1000(alice) gid=1001(alice) groups=1001(alice),1000(employees)

$ id --user --name
alice
$ id --user --name -a
alice

参考サイト

ユーザーが所属するグループを表示する groups コマンドのメモ。

ユーザーが所属するグループを表示する groups コマンドの使い方のメモ。

このメモは ubuntu 20.10 の Docker コンテナ上の groups コマンドを使っている。

$ docker container run --rm -it ubuntu:20.10 /bin/bash

groups コマンドのバージョン。

# groups --version
groups (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie and James Youngman.

groups コマンドの使い方

groups コマンドはユーザーが所属するグループを表示するコマンド。

groups コマンドは使い方に関しては特に書くことがないくらいシンプルなコマンドだけど自分はたまに「あれ、どうやって使うんだっけ」みたいになるので使い方をメモしておく。

基本的な使い方

groups コマンドは groups <ユーザー> みたいにユーザーを指定して実行すると指定したユーザーが所属するすべてのグループの名前を表示する。

# whoami
root

# groupadd employees
# useradd alice --create-home --groups employees

# groups alice
alice : alice employees

groups コマンドは groups みたいにユーザーを指定しないで実行すると groups コマンドを実行したユーザーが所属するすべてのグループの名前を表示する。

# su - alice
$ whoami
alice
$ groups
alice employees

--help オプション: ヘルプ

--help オプションを指定すると groups コマンドの使い方を表示する……んだけど man groups が使えないときにしか使わない。

# groups --help
Usage: groups [OPTION]... [USERNAME]...
Print group memberships for each USERNAME or, if no USERNAME is specified, for
the current process (which may differ if the groups database has changed).
      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Report any translation bugs to <https://translationproject.org/team/>
Full documentation <https://www.gnu.org/software/coreutils/groups>
or available locally via: info '(coreutils) groups invocation'