🕰️

あの日見たtouchコマンドの意味を僕達はまだ知らない。

2024/04/10に公開

はじめに

皆さんはtouchコマンドをご存知ですか?

私は以下のように、ターミナル内でtouchコマンドを利用して、よく新しい空ファイルを作成しています。

touch 作りたいファイル名

以前、私が書いた記事を読んでくれた友人から、次のような感想をいただきました。

  • JSONがJISにも翻訳されてるのは知らんかった

  • JSONの文字列はダブルクォーテーションで囲むように定義されてる

  • touchコマンドは本来新しい空ファイルを作るコマンドではないことは頭の片隅に置いといてほしいかも?

待て待て待て!え?touchコマンドって、新しい空ファイルを作るコマンドじゃないの!?どういうことだ!?

touchコマンドって本来はどういったものなんや?

Wikipediaによると、次のように説明されていました。

touchは、標準的なUnixのプログラムであり、ファイルの最終アクセス時刻と最終変更時刻を変えるために使用される。また、新規の空ファイルを作成するためにも使用される。

ファイルの最終アクセス時刻と最終変更時刻を変えるために使用される

どうやら、本来、touchコマンドはタイムスタンプの更新に使われるものらしいです。

タイムスタンプとは?

タイムスタンプは総務省によると、

ある時刻にその電子データが存在していたことと、それ以降改ざんされていないことを証明する技術。タイムスタンプに記載されている情報とオリジナルの電子データから得られる情報を比較することで、タイムスタンプの付された時刻から改ざんされていないことを確実かつ簡単に確認することができます。

と紹介されていました。

また、タイムスタンプを用いることで、以下のようなメリットがあります。

  1. ファイル管理: ファイルのタイムスタンプを使用することで、ファイルの作成時刻や最終更新時刻を把握することができます。これにより、ファイルの変更履歴を管理し、必要な場合に過去のバージョンに戻ることができます。
  2. セキュリティ: ファイルのタイムスタンプは、ファイルが最後にアクセスされた時刻や変更された時刻を示すため、セキュリティ上の問題を追跡するのに役立ちます。例えば、不正アクセスや不正な変更を検出するために使用できます。
  3. 同期: ファイルのタイムスタンプは、ファイルが変更された時刻を示すため、異なるデバイスやシステム間でファイルを同期する際に役立ちます。特定の時刻以降に変更されたファイルを同期することができます。
  4. バックアップ: バックアップソフトウェアは、ファイルのタイムスタンプを使用して、最後に変更されたファイルのみをバックアップすることができます。これにより、バックアップの効率が向上し、ストレージスペースを節約できます。
  5. アーカイブ: タイムスタンプを使用すると、古いファイルを自動的にアーカイブすることができます。一定期間以上変更されていないファイルを自動的にアーカイブすることで、ストレージスペースを効果的に管理できます。

タイムスタンプは、セキュリティなどの様々な観点で重宝されているようです。

touchコマンドのオプション

touchコマンドは本来、以下のようにして、使用するようです。

touch [オプション] [ファイル名]

何もオプションを指定していない場合は、デフォルトの動作に従います。
デフォルトの動作では、指定されたファイルが存在しない場合はそのファイルを新規に作成し、既存のファイルの場合はファイルの最終更新時刻を現在の時刻に更新します。

これから、Chat GPTが主なものであると言っていたオプションについて紹介します。

-a: アクセス時刻の更新

-aをオプションに指定している場合、アクセス時刻の更新をすることができます。

-c: ファイルが存在しない場合には、ファイルを作成しない

-cをオプションに指定している場合、ファイルが存在しない場合には何も処理を行わないようにすることができます。

このオプションは、ファイルの存在チェックと処理の実行を安全に行いたい時に便利でしょう。

-d: 指定した日時にタイムスタンプを設定

-dをオプションに指定している場合、指定した日時にタイムスタンプを設定することができます。
例えば、次のコマンドを使用すると、

touch -d "2022-04-07 15:30:00" example.json

example.jsonのタイムスタンプを2022年4月7日15:30に指定することができます。

このオプションを使用することによって、以下のようなメリットがあります。

  1. ファイルの復元: バックアップからファイルを復元する場合や、特定の状態にファイルを戻す必要がある場合に、ファイルを復元した時点の状態に戻すことができます。

  2. テスト用途: -dオプションを使用して、異なるタイムスタンプを持つファイルを作成することで、特定の条件下での動作をテストすることができます。

  3. ファイルの整理: ファイルやディレクトリの整理を行う際に、ファイルのタイムスタンプを変更することで、整理された日付や時刻にファイルを配置することができます。これにより、ファイルの整理や管理がより効率的に行えます。

10年後の8月

では、もし未来の日付を指定すると、どうなるでしょうか?
特に深い理由はありませんが、記事を執筆している現在から10年後の8月の日時を指定したいと思います。

touch -d "2034-08-10 15:30:00" example.json

このコマンドを使用した後、ls -l example.jsonで結果を確認してみました。

すると、指定した未来の日時にタイムスタンプが更新されていました。未来の日時も指定できるんですね。

-c: 指定した日時にタイムスタンプを設定

-cをオプションに指定している場合、指定した日時にタイムスタンプを設定することができます。

-dと異なる点として、時刻指定のフォーマットが異なり、[[CC]YY]MMDDhhmm[.ss]という形式になっています。

ここで、

  • CC は世紀を表し、省略可能です。省略された場合、現在の世紀が使われます。
  • YY は年を表し、省略可能です。省略された場合、現在の年が使われます。ただし、YYが69から99の間の場合は19が、00から68の間の場合は20が自動的に前置されます。
  • MM は月を表します。
  • DD は日を表します。
  • hh は時を表します。
  • mm は分を表します。
  • .ss は秒を表し、省略可能です。

例えば、次のコマンドを使用すると、

touch -t 202204071530.00 example.json

example.jsonのタイムスタンプを2022年4月7日15:30に指定することができます。

これで、指定した日時にタイムスタンプを設定する場合は、-dと-cのオプションを自由に選択できますね!

10年後の8月

では、-tオプションで未来の日付を指定すると、どうなるでしょうか?
今回も特に深い理由はありませんが、記事を執筆している現在から10年後の8月の日時を指定したいと思います。

touch -t 203408101530.00 example.json

このコマンドを使用した後、ls -l example.jsonで結果を確認してみました。

すると、やはり指定した未来の日時にタイムスタンプが更新されていました。これにより、-tオプションでも、未来の日付を指定できることが確認できました。

-f: ファイルを作成

-fをオプションに指定している場合、ファイルが存在しない場合にファイルを作成することができます。

挙動を明示的に指定できる点で、優れているのかもしれません。

-h: シンボリックリンクのタイムスタンプを更新

-hをオプションに指定している場合、シンボリックリンクのタイムスタンプを更新することができます。

いや!シンボリックリンクってなんだ!?

シンボリックリンクについて説明しているサイトによると、

シンボリックリンクとは、ある特定のファイルやディレクトリのパスを保存し、使用することで実際にそのパスにアクセスできるもののこと

とのことです。

どうやら元のファイルやディレクトリへの参照が作成され、そのシンボリックリンクを通じて元のファイルやディレクトリにアクセスすることができるようになるのだとか。便利そうですね!

-m: 変更時刻の更新(デフォルトの動作)

-mをオプションに指定している場合、デフォルトの動作を行います。

つまり、何も設定していない時と同様になり、ファイルの内容が変更されていない場合でも、touchコマンドを使用するだけで最終更新時刻が更新されます。

-r: 指定したファイルのタイムスタンプを使用して、ファイルのタイムスタンプを設定

-rをオプションに指定している場合、指定したファイルのタイムスタンプを使用して、ファイルのタイムスタンプを設定することができます。

例えば、次のコマンドを使用すると、

touch -r reference.txt file.txt

file.txtの最終更新時刻をreference.txtの最終更新時刻に合わせることができます。

このオプションを使用することによって、以下のようなメリットがあります。

  1. タイムスタンプの同期: あるファイルのタイムスタンプを別のファイルのタイムスタンプと同期させる必要がある場合に便利です。例えば、複数のファイルのタイムスタンプを統一したい場合などに使用できます。

  2. タイムスタンプの復元: バックアップから復元したファイルのタイムスタンプを元のファイルのタイムスタンプと同じにしたい場合に役立ちます。元のファイルと同じタイムスタンプを持つことで、復元されたファイルの正確な状態を保つことができます。

  3. ファイルの移動とコピー: ファイルを別の場所に移動したり、コピーしたりする際に、元のファイルと同じタイムスタンプを新しいファイルに設定したい場合に使用できます。これにより、ファイルの移動やコピーが行われた日時や時刻を維持できます。

まとめ

  • touchコマンドは元々、タイムスタンプの更新に使われるものだった。
  • touchコマンドを用いることで新しい空ファイルの作成もできる

このことを頭の片隅に入れておけば、少しだけ生活が豊かになる気がしませんか!?

皆さんも素敵なtouchコマンドライフを!!!🌸

その他参考記事

https://eng-entrance.com/linux-command-touch

https://e-words.jp/w/タイムスタンプ.html

GitHubで編集を提案

Discussion