ネットなどを調べると、「新しいファイルを作成するには次のように実行してください」と書かれているものが見つかります。
touch hoge.txt
実行してみると、確かにカレントディレクトリーに指定した名前のファイルが作られています。
しかし、touchのマニュアルをman touchで開くと、そこには「touch – change file access and modification times (ファイルのタイムスタンプを変更する)」と書かれています。
なぜファイルが作られるのでしょうか。 マニュアルの冒頭にその理由が書かれています。
「touchユーティリティは、ファイルの変更とアクセス時間を設定します。ファイルが存在しない場合は、デフォルトのアクセス許可で作成されます。」
指定したファイルが存在しないからデフォルトのパーミッションで(ファイルが)作成されるという動きをするため、touchコマンドでファイルが作成できると言うことみたいです。
本来の使い方はその後に説明されています。
「デフォルトでは、touchは変更とアクセス時間の両方を変更します。-A フラグと -m フラグを使用して、アクセス時間または変更時間を個別に選択できます。両方を選択すると、デフォルトと同等です。デフォルトでは、タイムスタンプは現在の時刻に設定されています。-D フラグと -t フラグは別の時刻を明示的に指定し、-r フラグは指定されたファイルの時刻を設定するように指定します。-Aフラグは、指定された量で値を調整します。」
試してみよう
実際に試してみましょう。まずはこのようなファイルを作ります。 lsコマンドで見ると、作成したときの日時になっています。
$ echo "hoge huga hogee" > hoge.txt $ ls -l total 4 -rw-rw-r-- 1 ubuntu ubuntu 16 Aug 1 10:17 hoge.txt
ファイルの作成日を偽装してみましょう。無事に日時を偽装できました。
$ touch -t 202412251230.45 hoge.txt $ ls -l total 4 -rw-rw-r-- 1 ubuntu ubuntu 16 Dec 25 2024 hoge.txt
テストのために、別のファイルをもう一つ作ります。
$ echo "foo bar" > foo.txt $ ls -l foo.txt -rw-rw-r-- 1 ubuntu ubuntu 8 Aug 1 10:23 foo.txt
foo.txtに対して、次のオプションを渡してコマンドを実行します。すると、指定した通り、タイムスタンプが2時間前になります。
$ touch -d "2 hours ago" foo.txt $ ls -l foo.txt -rw-rw-r-- 1 ubuntu ubuntu 8 Aug 1 08:24 foo.txt
今度は未来の日時にできるか試してみます。問題なくできますが、touch -d "3 hours later" foo.txtはinvalid date formatと言われてダメでした。
$ touch -d "3 hours later" foo.txt touch: invalid date format ‘3 hours later’ $ touch -t 202512251230.45 foo.txt $ ls -l foo.txt -rw-rw-r-- 1 ubuntu ubuntu 8 Dec 25 2025 foo.txt $ touch -d "next Friday" foo.txt $ ls -l foo.txt -rw-rw-r-- 1 ubuntu ubuntu 8 Aug 8 2025 foo.txt
あと一つ使うとしたら、別のファイルと同じタイムスタンプを設定するような使い方でしょうか。
$ ls -l total 8 -rw-rw-r-- 1 ubuntu ubuntu 8 Aug 8 2025 foo.txt -rw-rw-r-- 1 ubuntu ubuntu 16 Dec 25 2024 hoge.txt $ touch -r foo.txt hoge.txt total 8 -rw-rw-r-- 1 ubuntu ubuntu 8 Aug 8 2025 foo.txt -rw-rw-r-- 1 ubuntu ubuntu 16 Aug 8 2025 hoge.txt
これで提出物を提出する際にタイムスタンプを言われた日付にした上で提出する際も安心ですね。
また、未来の日付を指定したデータを作れるので、そういったファイルをアップロードしたときにどういった挙動を示すのか、アプリケーションのテストにも使えそうです。
ちなみに空のファイルを作成するには
空のテキストファイルを作成するなら、たとえば次の方法があります。
ただ空のテキストファイルが必要なときって実用ではめったにあることではないので、まあそのように動くわけだからtouchコマンドを使ってもいいのかもしれませんが、touchってそれだけに使えるコマンドではないというのは覚えていて損はないです。
cat > hoge等を実行したあとに何も書かずにCTRL+Cで抜ける- いや、CTRL+Cを実行するのはダサいから、
cat /dev/null > hogeを実行する
- いや、CTRL+Cを実行するのはダサいから、
- テキストエディターでファイルを開いて何も書かずに保存して抜ける