プログラミング

Bash ファイルの更新日時(mtime)や作成日時(ctime)を変更する

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です