web-dev-qa-db-ja.com

ファイルの「変更」日付を変更するにはどうすればよいですか?

「変更」日付を変更するにはどうすればよいですか?

$ touch -t 9901010000 test;stat test
  File: `test'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fe01h/65025d    Inode: 11279017    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    x)   Gid: ( 1000/    x)
Access: 1999-01-01 00:00:00.000000000 +0100
Modify: 1999-01-01 00:00:00.000000000 +0100
**Change: 2012-04-08 19:26:56.061614473 +0200**
 Birth: -
24
Someone1234

通常の方法でctimeを変更することはできません。これは設計によるものです。ファイルのメタデータを変更すると、ctimeは常に現在に更新されます。別のctimeを適用する方法はありません。ファイルのctimeを変更するには、次のいずれかを実行する必要があります。

  • システム時刻を強制したいctimeに設定し、ファイルをタッチして、システム時刻をリセットします。
  • カーネルを変更して、ctimeを変更するためのインターフェースを追加します。
  • ディスクイメージに直接アクセスし(たとえば、debugfsを使用)、ディスクのビットをいじります(ファイルシステムがマウントされているときに操作しないでください)。

関連するSO extXのjw013によって指摘された質問アンマウントされたディスク

# Update ctime
debugfs -w -R 'set_inode_field /tmp/foo ctime 201001010101' /dev/sda1

# Drop vm cache so ctime update is reflected
echo 2 > /proc/sys/vm/drop_caches
13
Coren

ファイルのctimeは、メタデータが変更されると更新されます。

$ ls -l x.py
-rw-rw-r--. 1 ignacio ignacio 485 Mar 26  2010 x.py
$ stat -c %z x.py
2010-03-26 11:57:56.237068175 -0400
$ chown ignacio x.py
$ stat -c %z x.py
2012-04-08 15:31:33.682383575 -0400
$ ls -l x.py
-rw-rw-r--. 1 ignacio ignacio 485 Mar 26  2010 x.py

$ NOW=$(date) && date -s "2030-08-15 21:30:11" && touch file.txt && date -s "$NOW"

https://www.shellhacks.com/fake-file-access-modify-change-timestamps-linux

0
evandrix

evandrix 's answer 次の行から抜粋、
NOW=$(date) && date -s "2030-08-15 21:30:11" && touch file.txt && date -s "$NOW"
下記のように改善する必要があります:

私のような一部のシステムでは、date出力は_date -s_で設定する有効な形式を提供しません

私のシステムbash Shell version:GNU bash、version 5.0.3(1)-release(x86_64-pc-linux-gnu)
私のシステムdateコマンドのバージョン:日付(GNU coreutils)8.30

私のシステムのdateコマンド出力とこの形式での日付の設定は次のとおりです。

_# date
Tue 21 Jan 2020 01:36:22 PM +03
# date -s "Tue 21 Jan 2020 01:36:22 PM +03"
date: invalid date ‘Tue 21 Jan 2020 01:36:22 PM +03’
_

したがって、 evandrix 答えを改善する必要があります。
タイムスタンプ値にNOW変数を割り当てることをお勧めします
_NOW=$(date)NOW=$(date +@%s)に変更

_  NOW=$(date +@%s) && date -s "2030-08-15 21:30:11" && \
  touch file.txt && date -s "$NOW"
_

非rootユーザー用のSudoコマンドの追加

_  Sudo bash -c 'NOW=$(date +@%s);
                date -s "2030-08-15 21:30:11";
                touch file.txt;
                date -s "$NOW"'
_

または

_  Sudo bash -c 'NOW=$(date +@%s); date -s "$2"; touch "$1"; date -s "$NOW"' -- \
                "file.txt" "2030-08-15 21:30:11"
_

このように簡単に使用できるように、ファイル名と設定日は、行の最後に引数として割り当てられます。