bash でファイルの編集日を更新する（タイムスタンプの更新）

## ファイルの変更日を更新したい

[検索猿人](https://qiitadon.com/@KEINOS/100581103159638457)な私は[「`bash` `ファイル` `編集日` `更新`」を Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+bash+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB+%E7%B7%A8%E9%9B%86%E6%97%A5+%E6%9B%B4%E6%96%B0)も、タイトルでドンピシャのものがヒットしなかったので、忘れん坊な未来の自分の備忘録として。

## TL;DR

> まいっちんぐマチコ先生の答え
> 
> **`touch`[^touch] コマンドを使う**。Unix/Linux の `touch` コマンドで、ファイルの「最終アクセス時刻」と「最終変更時刻」を現在のタイムスタンプに変えることでファイルの変更日を更新する。空のファイルを作るだけではないのだよ。

```bash:bash
#!/usr/bin/env bash

PATH_FILE='/Users/me/Documents/data_md/something.md'

if [ -e $PATH_FILE ]; then
    # ファイルの変更日を更新する。
    touch $PATH_FILE
fi

```

<details><summary>動作確認環境</summary><div>

- macOS Mojave（OSX 10.14.2）
- bash（GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)）

</div></details>

## TS;DR

### 記憶を時間軸で管理するも I know ランダムアクセスメモリー

どうやら私の脳みそ、というか記憶はトコロテンらしく押し出し式で古い記憶が消されるっぽいのです。衝撃にも弱く、何かとすぐに飛んじゃう FIFO[^fifo] なメモリーなのです。

そのため、記憶を各々のテキストに書いて、一元的（特定のディレクトリ）に保存しておいて検索をかけます。まぁ、それは普通のことで Evernote[^evernote] などで同じことをされている人はたくさんいると思います。

次に、ストックしたファイル置き場（ディレクトリやフォルダ）に**検索をかけてからファイルの編集日でソートをかける**ことがよくあります。つまり、Mac の Finder で言うところの「表示順序を、変更日順に並び替えた状態」です。

その際、**該当するファイルを見つけたら、そのまま上書き保存する**という、忘れん坊の経験則的な手癖がついてしまっています。

と言うのも、これ（上書き＋更新日でソート）により、**ファイルが記憶の時間軸に並ぶので、頻度や重要度の客観的な認知ができる**からです。上位に表示されるものは忘れる頻度の高いもの、もしくは覚えられないもの。そして下位に表示されるものは思い出せなくて当然なくらい頻度の低いものか、たまに忘れる系のもの、と言った塩梅です。

### Touch down the Markdown

これまで Kobito[^kobito]、GMail の宛先未指定の一時保存メール、Google Drive のメモ、macOS や iOS の「メモ」アプリデータ、Evernote、etc...etc... といった複数環境で各種メモを取っていました。いままでは各々のエディタで開いては保存をしていたのですが、年始に平成最後のフォルダの大掃除を行いました。

OS を HightSierra から Mojave に入れ替える際に、これらのメモを Markdown[^md] に直して、一箇所に保存し、そこから各種アプリに同期させるようにしたのです。（頑張った）

これによりキーボードから手を離す頻度が減り、ターミナル操作が増えました。

すると、整頓して早々に **Finder やアプリからデータを探すのが逆に億劫**になってきました。

ググる時と同じ感覚で、コマンドでファイル内の検索を求めるコマンドーな身体になってしまったのです。

その際のファイル内の文字列検索には Spotlight[^spotlight] の `mdfind`[^mdfind] コマンドでも良いのですが、**特定ディレクトリ下にあるファイルの文字列検索の場合には「`Rip Grep`」 を使った方が速い**[^rg]ため、`rg` コマンドを使っています。

```shell-session:rgの検索の基本
$ # 環境変数にデータの保存先のパスを設定しています
$ echo $PATH_DIR_MEMO
/Volumes/HDD_EXT/Data_Backup/Memo/
$ 
$ # ディレクトリ移動
$ cd $PATH_DIR_MEMO
$ 
$ # 文字列「アカウント情報」を検索
$ rg アカウント情報
zzzzzzzzzzzzzzzzzzzzzzz.md
5:Microsoft アカウント情報一覧
10:    - Microsoft Developer アカウント情報
xxxxxxxxxxxxxxxxxxxxxxx.md
3:## Qiita 登録アカウント情報
yyyyyyyyyyyyyyyyyyyyyyy.md
1:- 登録アカウント情報
12:GitHub にログイン後、アカウント情報を確認。
$ 
$ # 該当情報（ファイル）を見つけたので表示
$ cat yyyyyyyyyyyyyyyyyyyyyyy.md
（略）
```

記憶のカンニングをしているだけなのに、なんか良い感じです。

```shell-session:更新日順にソート
$ rg --sortr modified アカウント情報
xxxxxxxxxxxxxxxxxxxxxxx.md
3:## Qiita 登録アカウント情報
yyyyyyyyyyyyyyyyyyyyyyy.md
1:- 登録アカウント情報
12:GitHub にログイン後、アカウント情報を確認。
zzzzzzzzzzzzzzzzzzzzzzz.md
5:Microsoft アカウント情報一覧
10:    - Microsoft Developer アカウント情報
```


そこで、`touch` で更新できることを知り、概ね以下のような操作で更新しています。

```shell-session:更新日順で「アカウント情報」を含むファイル検索
$ # 環境変数にデータの保存先のパスを設定しています
$ echo $PATH_DIR_DATA
/Volumes/HDD_EXT/Data_Backup/Memo/
$ 
$ # 文字列「アカウント情報」を検索＋検索先のパス指定付き
$ rg --sortr modified アカウント情報 $PATH_DIR_DATA
/Volumes/HDD_EXT/Data_Backup/Memo/xxxxxxxxxxxxxxxxxxxxxxx.md
3:## Qiita 登録アカウント情報
/Volumes/HDD_EXT/Data_Backup/Memo/yyyyyyyyyyyyyyyyyyyyyyy.md
1:- 登録アカウント情報
12:GitHub にログイン後、アカウント情報を確認。
/Volumes/HDD_EXT/Data_Backup/Memo/zzzzzzzzzzzzzzzzzzzzzzz.md
5:Microsoft アカウント情報一覧
10:    - Microsoft Developer アカウント情報
$ 
$ # 確認
$ cat /Volumes/HDD_EXT/Data_Backup/Memo/zzzzzzzzzzzzzzzzzzzzzzz.md
（略）
$ 
$ # 更新
$ touch /Volumes/HDD_EXT/Data_Backup/Memo/zzzzzzzzzzzzzzzzzzzzzzz.md
```

実際には、上記一連の作業はパスの通ったシェルスクリプト経由で簡略化していますが、そのスクリプトは公開できるほど作り込んでいないのと、本当に使い勝手が良いのかまだ分からないので、良い感じであれば別記事で Qiita にあげたいと思います。

<!-- ##### リンク一覧 ##### -->

[^spotlight]: 【Spotlight とは】Mac の検索機能。Spotlight の検索対象に（[SQLite3](https://ja.wikipedia.org/wiki/SQLite) で DB 化）されたものは検索が早い。 「[Spotlight](https://ja.wikipedia.org/wiki/Spotlight)」@ Wikipedia
[^evernote]: 【Evernote とは】オンライン・スクラップ帳。 「[Evernote](https://ja.wikipedia.org/wiki/Evernote)」@ Wikipedia
[^md]: 【Markdown とは】Qiita や GitHub などで採用されているテキストの記法。拡張子は一般的に「.md」。メモを取るときに便利な記法で、その記法で書いておくとビューアーで良い感じで表示される。ビューアーがなくても読みやすいので、覚えておくと良い。「[Markdown](https://ja.wikipedia.org/wiki/Markdown)」@ Wikipedia
[^fifo]: 【FIFO とは】先入れ先出し。つまり、先に入ったものから先に出て行くトコロテンな状態の IT 用語。「[FIFO](https://ja.wikipedia.org/wiki/FIFO)」@ Wikipedia
[^touch]: 【`touch` コマンドとは】「[touch (UNIX)](https://ja.wikipedia.org/wiki/Touch_(UNIX))」@ Wikipeida
[^mdfind]: 【`mdfind` コマンドとは】`find` コマンドの Mac 専用拡張コマンドみたいなもの。Spotlight のコマンド版。[`mdfind`コマンドの Qiita 記事検索](https://www.google.com/search?q=site:qiita.com+mdfind+%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89) @ Google
[^rg]: 【`rg` コマンドとは】RipGrep は爆速の文字列検索コマンド。「[RigGrepとは](https://qiita.com/KEINOS/items/9267e6f4e3806f508db0#ripgrep%E3%81%A8%E3%81%AF)」| 爆速 grep「ripgrep」をラズパイにインストールする【実測値あり】 @ Qiita
[^kobito]: 【Kobito とは】今は亡き Qiita 純正の Markdown エディタ。「[Kobito](https://kobito.qiita.com/)」@ Qiita.com