「シェルスクリプトで日付付きファイル名を作りたい」
こうした場面で欠かせないのが、dateコマンドです。
この記事では、dateコマンドの基本的な使い方から書式指定、相対日付の指定、シェルスクリプトでの活用法まで、実務で必要な知識をまとめて解説します。
dateコマンドとは?日付・時刻操作の基本
dateは、Linuxシステムの日付と時刻を表示・設定するコマンドです。単に現在時刻を確認するだけでなく、書式を指定して任意のフォーマットで日時を出力できるため、シェルスクリプトでのファイル名生成やログ記録で頻繁に使われます。
また、「昨日の日付」「3日前」といった相対的な日時指定もでき、バックアップスクリプトなどで重宝します。
dateコマンドの基本的な使い方
1. 現在の日時を表示する
引数なしで実行すると、現在のシステム日時が表示されます。$ date 2026年 3月 17日 月曜日 10:30:45 JST
2. 書式を指定して表示する
+ に続けて書式文字列を指定すると、任意のフォーマットで日時を出力できます。# YYYY-MM-DD形式 $ date +%Y-%m-%d 2026-03-17 # YYYY/MM/DD HH:MM:SS形式 $ date "+%Y/%m/%d %H:%M:%S" 2026/03/17 10:30:45 # 年月日のみ(ハイフンなし) $ date +%Y%m%d 20260317
3. よく使う書式一覧
以下がdateコマンドで頻繁に使う書式指定子です。・%Y:西暦(4桁)例:2026
・%m:月(01~12)
・%d:日(01~31)
・%H:時(00~23、24時間表記)
・%M:分(00~59)
・%S:秒(00~59)
・%T:時刻(%H:%M:%Sと同じ)例:10:30:45
・%A:曜日(ロケール依存)例:月曜日
・%s:UNIXタイムスタンプ(1970年1月1日からの秒数)
・%N:ナノ秒
・%Z:タイムゾーン名 例:JST
4. 特定の日時を指定して表示する(-dオプション)
-d(または --date)オプションを使うと、現在以外の日時を指定して表示できます。相対的な指定も可能です。# 昨日の日付を表示する $ date -d "yesterday" +%Y-%m-%d 2026-03-16 # 3日前の日付を表示する $ date -d "3 days ago" +%Y-%m-%d 2026-03-14 # 1週間後の日付を表示する $ date -d "1 week" +%Y-%m-%d 2026-03-24 # 来月の1日を表示する $ date -d "next month" +%Y-%m-01 2026-04-01 # 特定の日時を指定する $ date -d "2026-01-15 09:00:00" "+%Y年%m月%d日 %H時%M分" 2026年01月15日 09時00分
実務で使えるdate活用テクニック
5. シェルスクリプトで日付付きファイル名を作る
バックアップスクリプトで最もよく使うパターンです。$(date +書式) でコマンド置換を使います。# バックアップファイルに日付を付ける $ tar czf backup_$(date +%Y%m%d).tar.gz /var/www/html/ # 日時(時分秒)まで付ける $ cp /etc/httpd/conf/httpd.conf httpd.conf.$(date +%Y%m%d_%H%M%S) # 昨日の日付でログファイル名を生成する $ YESTERDAY=$(date -d "yesterday" +%Y%m%d) $ cat /var/log/app/access_${YESTERDAY}.log
6. ログファイルにタイムスタンプを付ける
スクリプトの実行ログにタイムスタンプを付けるのは、トラブル時の原因調査に役立ちます。# スクリプト内でタイムスタンプ付きログを出力する例 echo "[$(date '+%Y-%m-%d %H:%M:%S')] バックアップ開始" >> /var/log/backup.log tar czf /backup/data_$(date +%Y%m%d).tar.gz /var/data/ echo "[$(date '+%Y-%m-%d %H:%M:%S')] バックアップ完了" >> /var/log/backup.log
7. 経過時間を計測する
%s でUNIXタイムスタンプ(秒数)を取得できるので、処理の開始時刻と終了時刻の差で経過時間を計測できます。# 処理時間を計測するスクリプト例 START=$(date +%s) # ここに時間のかかる処理を書く sleep 5 END=$(date +%s) ELAPSED=$((END - START)) echo "処理時間: ${ELAPSED}秒"
8. システム日時を変更する
-s オプションでシステムの日時を手動設定できます。root権限が必要です。# システム日時を設定する(root権限が必要) $ sudo date -s "2026-03-17 10:00:00" 2026年 3月 17日 火曜日 10:00:00 JST
# timedatectlで日時を設定する(推奨) $ sudo timedatectl set-time "2026-03-17 10:00:00" # 現在の時刻同期の状態を確認する $ timedatectl status
dateコマンドのトラブルシュートとよくあるミス
「invalid date」が出る場合
dateコマンドで「invalid date」エラーが出る原因のほとんどは、日付文字列のフォーマットが正しくないケースです。# NG - スラッシュ区切りは環境によって解釈が異なる $ date -d "03/17/2026" date: invalid date '03/17/2026' # OK - ハイフン区切りのISO 8601形式を使う $ date -d "2026-03-17"
タイムゾーンが意図と異なる場合
dateコマンドはシステムのタイムゾーン設定に従って動作します。異なるタイムゾーンで表示したい場合は、TZ 環境変数を一時的に設定します。# UTC(協定世界時)で表示する $ TZ=UTC date Mon Mar 17 01:30:45 UTC 2026 # ニューヨーク時間で表示する $ TZ=America/New_York date # 現在のタイムゾーン設定を確認する $ timedatectl show --property=Timezone Timezone=Asia/Tokyo
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 現在の日時を表示する | date |
| YYYY-MM-DD形式で表示する | date +%Y-%m-%d |
| 時刻のみ表示する | date +%T |
| 昨日の日付を取得する | date -d "yesterday" +%Y-%m-%d |
| N日前の日付を取得する | date -d "3 days ago" +%Y-%m-%d |
| UNIXタイムスタンプを取得する | date +%s |
| 日付付きファイル名を生成する | date +%Y%m%d |
| UTC時間で表示する | TZ=UTC date |
シェルスクリプトの基礎から体系的に学びませんか?
dateコマンドはシェルスクリプトの中で頻繁に使われますが、現場で活躍するにはスクリプト全体を書ける力が必要です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
