こんにちは!はづきです
文系から一部上場IT企業に就職し、エンジニアをやっています
この記事はLinuxのtouchコマンドについての備忘録です
基本操作や頻繁に使用するオプションの実行例を紹介します。ぜひご参考ください
※この記事は初心者向けに平易に解説しています。正確な理解をしたい人は専門書・専門家をあたっていただければと思います。また、この記事の情報におけるCPの動作結果については自己責任でお願いします。
※本サイトにはプロモーション・広告が含まれています(はづきのブログより)
タイムスタンプとは?種類と確認方法を解説
touchコマンドではタイムスタンプを更新することができます
まずは「タイムスタンプとは?」という疑問から解消していきましょう
タイムスタンプは、ファイルやディレクトリに付与されている日時情報のことです。作成された日時、最終アクセスされた日時、最終更新された日時、などをタイムスタンプと呼びます
上記のようにタイムスタンプはいくつか種類があります。以下で「stat」コマンドを実行してタイムスタンプの種類をみてみましょう!
※statコマンド...ファイル/ディレクトリのメタ情報を表示するコマンド
#事前に作成したfile1.txtについてstatコマンドでメタ情報を確認します
#「stat {メタ情報を確認したいファイル名}」で確認できます
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-14 21:48:05.699653645 +0900 #最終アクセス日時(atime)
Modify: 2023-08-14 21:48:05.699653645 +0900 #最終更新日時(mtime)
Change: 2023-08-14 21:48:05.699653645 +0900 #属性の変更日時(ctime)
Birth: 2023-08-14 21:48:05.699653645 +0900 #作成日時
statコマンドでatime,mtime,ctimeを確認することができました。これらがタイムスタンプと呼ばれる日時情報です
この3種類のタイムスタンプについて順番に解説します
atime:最終アクセス日時
atimeは最終アクセス日時を表すタイムスタンプです
ファイル内容を参照された際に、atimeが更新されます。例えば、catコマンドなどでファイル内容を参照すればコマンドを実行した現在日時で更新されることになります
atimeはstatコマンドでも確認できますが、「ls -lu」コマンドでatimeのみ確認することが可能です
以下で実行例を見てみましょう
#atime更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty filDevice: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-14 21:48:05.699653645 +0900 #atime
Modify: 2023-08-14 21:48:05.699653645 +0900
Change: 2023-08-14 21:48:05.699653645 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#catでファイル内容を確認
hazukiblog@hazukiBlog:~/work$ cat file1.txt
#atime更新後のタイムスタンプ情報を確認
#atimeのみ更新されていることがわかります
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900 #atimeの日時が更新されている
Modify: 2023-08-14 21:48:05.699653645 +0900
Change: 2023-08-14 21:48:05.699653645 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#「ls -lu」でatimeのみ確認できる
hazukiblog@hazukiBlog:~/work$ ls -lu file1.txt
-rw-r--r-- 1 hazukiblog hazukiblog 0 Aug 15 08:26 file1.txt
mtime:最終更新日時
mtimeは最終更新日時を表すタイムスタンプです
ファイル内容を更新した際に、mtimeが更新されます。例えば、標準出力などでファイル内容を更新すればコマンドを実行した現在日時で更新されることになります
先の例では、ctimeも同時に更新されます。mtimeとctimeは連動して更新されることが多いです
mtimeはstatコマンドでも確認できますが、「ls -l」コマンドでmtimeのみ確認することが可能です
以下で実行例を見てみましょう
#mtime更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900
Modify: 2023-08-14 21:48:05.699653645 +0900 #mtime
Change: 2023-08-14 21:48:05.699653645 +0900 #ctime
Birth: 2023-08-14 21:48:05.699653645 +0900
#標準出力を用いてdateコマンドの結果をfile1.txtの末尾に追記
hazukiblog@hazukiBlog:~/work$ date >> file1.txt
#mtime更新後のタイムスタンプ情報を確認
#mtimeとctimeが更新されている
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 29 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900
Modify: 2023-08-15 08:40:00.179170663 +0900 #mtimeの日時が更新されている
Change: 2023-08-15 08:40:00.179170663 +0900 #ctimeの日時も更新されている
Birth: 2023-08-14 21:48:05.699653645 +0900
#「ls -l」でmtimeのみ確認できる
hazukiblog@hazukiBlog:~/work$ ls -l file1.txt
-rw-r--r-- 1 hazukiblog hazukiblog 58 Aug 15 08:41 file1.txt
ファイル内容の更新といえば、viコマンドでエディタを開いて編集することが多いでしょう
viコマンドで編集した場合は、以下のようにすべてのタイムスタンプが更新されます
#mtime更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file2.html
File: file2.html
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 820h/2080d Inode: 997 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-14 21:50:09.449650288 +0900 #atime
Modify: 2023-08-14 21:50:09.449650288 +0900 #mtime
Change: 2023-08-14 21:50:09.449650288 +0900 #ctime
Birth: 2023-08-14 21:50:09.449650288 +0900
#viコマンドでファイルを編集
hazukiblog@hazukiBlog:~/work$ vi file2.html
#mtime更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file2.html
File: file2.html
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3678 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:36:36.939190849 +0900 #atimeの日時が更新されている
Modify: 2023-08-15 08:36:36.939190849 +0900 #mtimeの日時が更新されている
Change: 2023-08-15 08:36:36.949190849 +0900 #ctimeの日時が更新されている
Birth: 2023-08-15 08:36:36.939190849 +0900 #作成日時が更新されている
ctime:属性の変更日時
ctimeは属性の変更日時を表すタイムスタンプです
ファイルの属性はファイルに付与されているパーミッションや所有者情報などのメタデータのことです。「ls -l {ファイル名}」で表示されるやつですね
chmodコマンドなどでファイルの属性を変更したときにctimeも更新されます
ctimeはstatコマンドでも確認できますが、「ls -lc」コマンドでctimeのみ確認することが可能です
以下で実行例を見てみましょう
#ctime更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900
Modify: 2023-08-15 08:41:09.859168669 +0900
Change: 2023-08-15 08:41:09.859168669 +0900 #ctime
Birth: 2023-08-14 21:48:05.699653645 +0900
#chmodコマンドでファイルのパーミッションを更新する
hazukiblog@hazukiBlog:~/work$ chmod 777 file1.txt
#ctime更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900
Modify: 2023-08-15 08:41:09.859168669 +0900
Change: 2023-08-15 10:10:39.812242606 +0900 #ctimeの日時も更新されている
Birth: 2023-08-14 21:48:05.699653645 +0900
#「ls -lc」でmtimeのみ確認できる
hazukiblog@hazukiBlog:~/work$ ls -lc file1.txt
-rwxrwxrwx 1 hazukiblog hazukiblog 58 Aug 15 10:10 file1.txt
touchコマンドでタイムスタンプを更新する
touchコマンドはタイムスタンプの変更を行えるコマンドです
以下では基本の使い方とオプションについて解説します
-t:指定した日時でタイムスタンプを更新する①
-tオプションは指定した日時でタイムスタンプを更新することができます
コマンドの使い方は「touch -t {YYYYMMDDHHmm.ss} {更新したいファイル名}」です
他オプションで更新したいタイムスタンプを指定しない場合は、atimeとmtimeが指定した日時で更新されます
以下でその実行例を見てみましょう
#更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 08:26:14.349221847 +0900
Modify: 2023-08-15 08:41:09.859168669 +0900
Change: 2023-08-15 10:10:39.812242606 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#「touch -t」でタイムスタンプの更新
hazukiblog@hazukiBlog:~/work$ touch -t 202301010000.00 file1.txt
#更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-01-01 00:00:00.000000000 +0900 #atimeは指定した日時で更新された
Modify: 2023-01-01 00:00:00.000000000 +0900 #mtimeは指定した日時で更新された
Change: 2023-08-15 10:27:06.035547948 +0900 #ctimeは現在日時で更新された
Birth: 2023-08-14 21:48:05.699653645 +0900
-d:指定した日時でタイムスタンプを更新する②
-dオプションを付けると、-tオプションと同様に指定した日時でタイムスタンプを更新することができます
-tオプションとの違いは、日時指定をString(文字列型)で指定するところにあります
「touch -d "{YYYY-m-d hh:mm}" {更新したいファイル名}」の形で実行します
日時指定の形式は「{YYYY-m-d hh:mm}」でなくても多少融通が利きます
#更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-01-01 00:00:00.000000000 +0900
Modify: 2023-01-01 00:00:00.000000000 +0900
Change: 2023-08-15 10:27:06.035547948 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#「touch -d」でタイムスタンプの更新
hazukiblog@hazukiBlog:~/work$ touch -d "2023-2-2 12:00" file1.txt
#更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-02-02 12:00:00.000000000 +0900 #atimeは指定した日時
Modify: 2023-02-02 12:00:00.000000000 +0900 #mtimeは指定した日時
Change: 2023-08-15 10:29:09.990540974 +0900 #ctimeは現在日時で更
Birth: 2023-08-14 21:48:05.699653645 +0900
ちなみに、以下のように-tオプションと同じフォーマットで日時指定をするとエラーが出ます
hazukiblog@hazukiBlog:~/work$ touch -d 202302020000.00 file1.txt
touch: invalid date format ‘202302020000.00’
-m:mtimeを更新する
-mオプションを付けるとmtimeのみを更新することができます
-tや-dといったオプションと併用することで、指定した日時でmtimeを更新することができます。このときctimeも現在日時で更新されます
一方で、日時指定をせずに「touch -m {更新したファイル名}」を実行するとmtimeとctimeがどちらも現在日時で更新されます
以下で実行例を見てみましょう
#更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-03-03 12:00:00.000000000 +0900
Modify: 2023-08-15 10:35:37.173852949 +0900
Change: 2023-08-15 10:35:37.173852949 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#「touch -m」でタイムスタンプの更新
hazukiblog@hazukiBlog:~/work$ touch -md "2025-1-1 12:00" file1.txt
#更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-03-03 12:00:00.000000000 +0900
Modify: 2025-01-01 12:00:00.000000000 +0900 #mtimeは指定した日時で更新された
Change: 2023-08-15 10:41:23.959664271 +0900 #ctimeは現在日時で更新された
Birth: 2023-08-14 21:48:05.699653645 +0900
-a:atimeを更新する
-aオプションを付けるとatimeのみを更新することができます
-tや-dといったオプションと併用することで、指定した日時でatimeを更新することができます。このときctimeも現在日時で更新されます
一方で、日時指定をせずに「touch -a {更新したファイル名}」を実行するとatimeとctimeがどちらも現在日時で更新されます
以下で実行例を見てみましょう
#更新前のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-03-03 12:00:00.000000000 +0900
Modify: 2023-08-15 10:47:06.422974471 +0900
Change: 2023-08-15 10:47:06.422974471 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#「touch -a」でタイムスタンプの更新
hazukiblog@hazukiBlog:~/work$ touch -ad "2025-1-1 12:00" file1.txt
#更新後のタイムスタンプ情報を確認
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2025-01-01 12:00:00.000000000 +0900 #atimeは指定した日時で更新された
Modify: 2023-08-15 10:47:06.422974471 +0900
Change: 2023-08-15 10:48:01.066305245 +0900 #ctimeは現在日時で更新された
Birth: 2023-08-14 21:48:05.699653645 +0900
-r:既存ファイルのタイムスタンプを設定する
-rオプションを付けると、既存ファイルに付与されているタイムスタンプの情報で別のファイルのタイムスタンプを更新することができます
実行形式は「touch -r {既存のファイル名} {更新したいファイル名}」となります
以下で実行例を見てみましょう
#file2.htmlのタイムスタンプでfile1.txtを更新してみます
#まずはfile1.txtの更新前のタイムスタンプを確認します
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2023-08-15 10:48:24.227970871 +0900
Modify: 2023-08-15 10:47:06.422974471 +0900
Change: 2023-08-15 10:48:24.227970871 +0900
Birth: 2023-08-14 21:48:05.699653645 +0900
#次にfile2.htmlのタイムスタンプを確認します
hazukiblog@hazukiBlog:~/work$ stat file2.html
File: file2.html
Size: 5 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3678 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2025-01-01 00:00:00.000000000 +0900
Modify: 2025-01-01 00:00:00.000000000 +0900
Change: 2023-08-15 10:56:07.222946584 +0900
Birth: 2023-08-15 08:36:36.939190849 +0900
#「touch -r」でタイムスタンプを更新します
hazukiblog@hazukiBlog:~/work$ touch -r file2.html file1.txt
# file1.txtがfile2.htmlのタイムスタンプ情報で更新されました
hazukiblog@hazukiBlog:~/work$ stat file1.txt
File: file1.txt
Size: 58 Blocks: 8 IO Block: 4096 regular file
Device: 820h/2080d Inode: 3648 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/hazukiblog) Gid: ( 1000/hazukiblog)
Access: 2025-01-01 00:00:00.000000000 +0900 #file2.htmlと同じになっている
Modify: 2025-01-01 00:00:00.000000000 +0900 #file2.htmlと同じになっている
Change: 2023-08-15 11:01:02.257941435 +0900 #file2.htmlと同じになっている
Birth: 2023-08-14 21:48:05.699653645 +0900
touchコマンドでファイルを新規作成する
touchコマンドではファイルを新規作成することもできます
ここではファイル作成の基本的なコマンド操作とファイル作成に関するオプションを紹介します
ファイルの新規作成
ファイル作成は「touch {ファイル名}」で行うことができます
ファイル名を複数指定することで複数のファイルを同時に作成することも可能です
指定したファイル名と同じファイルが既に存在する場合は、タイムスタンプが更新されるだけでファイルは新規作成されません。ファイルの中身が上書き(空になる)されることもありません
#ファイルが存在しないことを確認
hazukiblog@hazukiBlog:~/work$ ls
#touchコマンドでファイルを新規作成
hazukiblog@hazukiBlog:~/work$ touch file1
#作成されていることを確認
hazukiblog@hazukiBlog:~/work$ ls
file1
#同時に複数のファイル作成も可能
hazukiblog@hazukiBlog:~/work$ touch file2 file3
hazukiblog@hazukiBlog:~/work$ ls
file1 file2 file3
-c:ファイルを新規作成しない
-cオプションを付けるとファイルが新規作成されません
既存ファイルのタイムスタンプの更新のみを行いたい場合に利用します。誤って存在しないファイル名を指定してしまっても、ファイルが新規作成されることはないため純粋にタイムスタンプ更新の機能だけを使うことができます
存在しないファイル名を指定した場合、エラーは出ることはなくそのまま処理が終了します(何も処理しない)
#既存のfile4.txtのタイムスタンプを更新する
hazukiblog@hazukiBlog:~/work$ touch -cd "2023-2-2 12:00" file4.txt
hazukiblog@hazukiBlog:~/work$ ls
file1 file2 file3 file4.txt
#存在しないfile5を指定してしまってもファイルは新規作成されない
hazukiblog@hazukiBlog:~/work$ touch -cd "2023-2-2 12:00" file5
hazukiblog@hazukiBlog:~/work$ ls
file1 file2 file3 file4.txt
今回はLinuxのtouchコマンドについて紹介しました
みなさんのお役に立てば幸いです。最後まで読んでいただきありがとうございました
おしまい
コメント