設定ファイルを変更するたびに $(date +%Y%m%d) を手打ちするのは、回数が増えると確実に面倒になります。シェルの設定ファイルに日付取得の関数を一度定義しておくだけで、以降はその関数名を呼び出すだけで日付入りのファイル名を生成できるようになります。
結論:~/.bashrc に関数を追記する
以下の2行を ~/.bashrc の末尾に追記するだけです。
today() { date +%Y%m%d; }
now() { date +%Y%m%d_%H%M%S; }
追記後に設定を現在のシェルセッションへ反映します。
source ~/.bashrc
以降は次のように使えます。today は日付のみ(例: 20260707)、now は秒まで含んだ値(例: 20260707_143022)を返します。
# nginx の設定ファイルをバックアップ
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_$(today)
# 同日に複数回バックアップを取る場合は now を使う
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_$(now)
環境変数ではなく関数で定義する理由
古いドキュメントによく見かける方法として、.bash_profile に環境変数として日付を定義する手順があります。
export DAY=$(date +%Y%m%d) # ← ログイン時点の日付で固定される
この方法には致命的な欠点があります。変数の値はログインした瞬間の日付で固定されるため、夜間の保守対応などで日をまたいで作業した場合、$DAY は前日の日付を指したままになります。深夜0時を過ぎてから取得したバックアップが昨日の日付で記録されるのは、障害対応の証跡管理として致命的に紛らわしい事態です。
関数として定義すれば、呼び出すたびに date コマンドが実行されるため、常に実行時点の日付を返します。この挙動の差が、変数定義より関数定義を選ぶ最大の理由です。
また、古い手順では日付フォーマットに %y%m%d(西暦2桁)が使われていますが、現代の実務では %Y%m%d(西暦4桁)を使うのが標準です。260707 より 20260707 のほうがファイル名を見ただけで年が確定できます。
~/.bashrc の編集手順
まず編集前のバックアップを取ります。ここでも date を直接使います。
cp ~/.bashrc ~/.bashrc_$(date +%Y%m%d)
お好みのエディタで ~/.bashrc を開き、末尾に以下を追記します。
# 日付・日時をファイル名に付けるための関数
today() { date +%Y%m%d; }
now() { date +%Y%m%d_%H%M%S; }
保存後、設定を反映します。
source ~/.bashrc
.bashrc と .bash_profile の使い分けについて補足します。.bashrc はターミナルを開くたびに読み込まれるインタラクティブシェル向けの設定ファイルで、関数・エイリアス・プロンプトの定義はここに書くのが現代的な慣習です。多くのディストリビューション(RHEL 9系・Ubuntu 22.04以降・Debian 12など)では .bash_profile が .bashrc を自動で読み込む設定になっているため、SSH ログインシェルでも .bashrc に書いた関数が有効になります。
動作確認の手順
まず関数が期待どおりの値を返すか確認します。
$ today
20260707
$ now
20260707_143022
次にファイルのリネームで実際の動作を確認します。
$ touch test.txt
$ mv test.txt test.txt_$(today)
$ ls -l
-rw-r--r-- 1 user user 0 Jul 7 14:30 test.txt_20260707
ファイル名の末尾に当日の日付が付いていれば設定は完了です。
実務での応用パターン
ある運用現場では、設定ファイルに手を入れる前の採取と、ログの退避をセットにした手順を標準化しています。
# 設定変更前のスナップショットを取る
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config_$(today)
# ログを圧縮して日付付きで退避
gzip -c /var/log/app/error.log > /var/log/app/error.log_$(today).gz
# 複数ファイルをまとめて日付付きアーカイブにする
tar czf backup_$(today).tar.gz /etc/nginx/ /etc/ssl/
ファイル名から変更・採取した日が一目で確認できるため、「この変更を加えたのはいつか」「どの世代に戻すべきか」といった判断が格段に速くなります。
cron・systemd タイマーとの組み合わせ時の注意
シェル関数はインタラクティブシェルのセッション内でのみ有効です。cron や systemd のタイマーユニットから呼び出すスクリプトでは ~/.bashrc は読み込まれないため、today や now は展開されません。自動化スクリプト内では date を直接記述します。
#!/bin/bash
# cron や systemd から呼ばれるスクリプトでは date を直接使う
DATESTAMP=$(date +%Y%m%d)
tar czf /backup/db_${DATESTAMP}.tar.gz /var/lib/mysql/
crontab に直接記述する場合、% はエスケープが必要です。
# crontab -e での記述例(% を \% にエスケープする)
0 3 * * * tar czf /backup/db_$(date +\%Y\%m\%d).tar.gz /var/lib/mysql/
zsh をデフォルトシェルとして使っている環境(Ubuntu 22.04 以降で手動設定した場合など)では、~/.zshrc に同じ関数を追記します。構文はまったく同じです。現在のログインシェルは echo $SHELL で確認できます。
# zsh の場合(~/.zshrc に追記)
today() { date +%Y%m%d; }
now() { date +%Y%m%d_%H%M%S; }
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

コメント