LinuxコマンドラインのBashにおいて、ファイルの更新日時(mtime)や作成日時(ctime)を変更する方法について紹介します。
ファイルの更新時刻をファイルへの書き込みやアクセスなしで行いたい場合があります。
と言っても、ファイルの更新をprintfやechoで行うことはできないっぽいですので、文字を加えて削除するとか面倒なことをしない限りは今回説明する方法を取ったほうが良さそうです。
# ファイルに改行が追加されてしまう
echo "" >> "${TIME_MANAGEMENT_DIR}/time_management.txt"
# ファイルに変更は加えられないが、更新日時も変更されない。
printf "" >> "${TIME_MANAGEMENT_DIR}/time_management.txt"
まずはstatでファイルの現在の更新日時やアクセス日時を確認してみます。
$stat "${TIME_MANAGEMENT_DIR}/time_management.txt"
File: '/mnt/c/time_management/time_management.txt'
Size: 385 Blocks: 0 IO Block: 4096 regular file
Device: 11h/17d Inode: 336362597169482697 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/ yuis) Gid: ( 1000/ yuis)
Access: 2019-06-29 14:59:40.666044600 +0900
Modify: 2019-06-29 14:59:40.666044600 +0900
Change: 2019-06-29 14:59:40.666044600 +0900
アクセス日時の変更をするには、touch -a
を使用します。
$ /bin/touch -a --date="@1561788231" "${TIME_MANAGEMENT_DIR}/time_management.txt"
# // `1561788231` ... `date +%s`
$ /bin/touch --help
-a change only the access time
-d, --date=STRING parse STRING and use it instead of current time
-m change only the modification time
変わりましたね。
$ stat "${TIME_MANAGEMENT_DIR}/time_management.txt"
File: '/mnt/c/time_management/time_management.txt'
Size: 385 Blocks: 0 IO Block: 4096 regular file
Device: 11h/17d Inode: 336362597169482697 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 1000/ yuis) Gid: ( 1000/ yuis)
Access: 2019-06-29 15:03:51.000000000 +0900
Modify: 2019-06-29 14:59:40.666044600 +0900
Change: 2019-06-29 15:04:49.266605100 +0900
Birth: -
上記と同様に、更新日時はtouch -m
を使用します。
/bin/touch -m --date="@$( date +%s )" "${TIME_MANAGEMENT_DIR}/time_management.txt"
Linux – Fake File Access, Modify and Change TimeStamps – ShellHacks