Linuxコマンドを使用して生成されたファイルの時刻と日付を変更する別の方法は何ですか? [閉鎖]

Linuxコマンドを使用して生成されたファイルの時刻と日付を変更する別の方法は何ですか? [閉鎖]

これは、Linuxコマンドを使用して作成されたファイルです。

touch tmp.txt

さて、日付と時刻を変更しようとしています。だから私がすることは次のとおりです。

ls -l tmp.txt
-rwrx-rx-x 1 yush guest 600 jul 10 16:58 tmp.txt

上記で生成されたファイルの年を変更するには、次のコマンドを使用しますか?

touch -d "1 year ago" tmp.txt

今、

ls -l tmp.txt 
-rwxr-xr-x 1 yush guest 600 jul 10 2016 tmp.txt

私の質問は、Linuxを使用して上記のタスクを実行する他のコマンドがありますか?

答え1

アクセスおよび変更時間を明示的に設定します。

# touch -t [[CC]YY]MMDDhhmm[.SS]

例えば

# touch -t 201212101830.55 tmp.txt
# touch -d "2012-10-19 12:12:12.000000000 +0530" tmp.txt
# touch -d "2017-10-19 14:59:12" tmp.txt

他のファイルのタイムスタンプを使用できます。

# touch -r file1.txt file2.txt

答え2

これを行うには、アーカイバを使用できます(きれいでも簡単ではありません)。実際のファイル(ファイルシステム内)のメタデータ(権限モード、所有者、グループ、変更日時など)はinode(たとえば「システムデータ」)に保存されますが、ファイルのメタデータはアーカイブファイルはユーザーデータとしてアーカイブファイルに保存されます。これは通常操作できますが、難易度は異なります。

たとえば、見てみましょう。cpio他のアーカイブプログラム(例えば、、、、ホームなど)を使用してar同様の効果を得ることができます。まず、既知の変更日時(再現性のため)を使用してファイルを作成し、そのファイルのみを含むtarcpioアーカイブを作成します。オプションには以下が含まれます。paxziptmp.txtcpiooああcpio出力(アーカイブが記録されることを意味)とc移植可能(互換)形式を使用すると、操作が簡単になります。

$ touch -d "2017年7月12日 00:00" tmp.txt

$ls -l tmp.txt
-rw-r--r-- 1マイユーザー名マイグループ名  0 7月12日 00:00 tmp.txt

$エコtmp.txt -oc> tmp.cpio |
1個

アーカイブを確認してください。  cpio -itvファイルを読むことを意味します(入力)を生成し、Vエルボスティー可能なコンテンツ。

$cpio -itv<tmp.cpio
-rw-r--r-- 1マイユーザー名マイグループ名  0 7月12日 00:00 tmp.txt
1個

$cattmp.cpio
070701000595CC000081A4000303E900030201000000015965668000000000000068E70000C36100
0000000000000000000000800000000tmp.txt07070100000000000000000000000000000000000000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000B00000000トレーラー! ! !

リバースエンジニアリングを介して(おそらくどこかに文書化されているはずです。確認していません)、アーカイブ内の最初のファイルの変更された日時が1月1日以降のUnix時間(秒数を示す32ビット整数)として保存されていますを発見しました。 、1970 00:00 GMT以降)形式は、文字位置47-54の8桁の16進数です。上記の値を強調表示しました59656680。 8桁の16進形式のUnix時間であることを知っていると、見つけるのは難しくありません。あなたは得ることができます現在のunix time(decimal) コマンドを使用すると、date +%s次のように 16 進数でインポートできます。

(date +%s; echo "16op") | dc

今メタデータを修正してください!目的のエディタを使用してアーカイブを編集します。

$vi tmp.cpio
0707010005807C000081A4000303E900030201000000015965668000000000000068E70000C36100
0000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000
0000000010000000000000000000000000000000000000000000000000000B00000000トレーラー
!!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@
~
~
~
~
~
"tmp.cpio" [最後の行不完全] 1行、512文字

何に変えたいかを調べてください。あなたの質問で時計を1年前に戻すと言われました。通常の365日1年の秒数は365×24×60×60 = 31536000(10進数)= 1E13380(16進数)です。したがって、59656680-1E13380を除くと、結果は57843300です。ファイルから変更します。

0707010005807C000081A4000303E900030201000000015784330000000000000068E70000C36100
0000000000000000000000800000000tmp.txt^@^@^@0707010000000000000000000000000000000
0000000010000000000000000000000000000000000000000000000000000B00000000トレーラー
!!!^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@^@^@^@^@^@^@^
@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^ @^@^@^@^@^@^@^@^@
~
~
~
~
~
"tmp.cpio" [最後の行不完全] 1行、512文字

保存と終了。変更を確認してください。

$cattmp.cpio
070701000595CC000081A4000303E900030201000000015784330000000000000068E70000C36100
0000000000000000000000800000000tmp.txt0707010000000000000000000000000000000000000
001000000000000000000000000000000000000000000000000000000B00000000トレーラー! ! !

$cpio -itv<tmp.cpio
-rw-r--r-- 1マイユーザー名マイグループ名  2012年7月0日  2016年tmp.txt
1個

$cpio -imuv<tmp.cpio
tmp.txt
1個

$ls -l tmp.txt
-rw-r--r-- 1マイユーザー名マイグループ名  2012年7月0日  2016年tmp.txt

見て、ファイルの変更日時を変更しました。 (アーカイブを読み取らずにファイルを抽出 cpio -iしません。復元t-m酸化 -u時間あなたnconditional(このオプションがないと、 cpio新しいファイルは通常どおり古いファイルで上書きされません。)-vVerbose(表示ファイル名)。 )

メモ:

  • などのコマンドを使用すると、人間が読める日付のUnix日付(秒など)を取得できますdate -d "Jan 1, 2001" +%s。前述の(デスクトップ電卓)トリックを使用してdcこれを16進数に変換します。
  • cpio アーカイブ形式にはヌルバイトが含まれています。vi( )の現在のバージョンはvimこれを尊重しているようです(つまり、それを容認し、単独で置くこと)。以前のバージョンを含む他の編集者は、viそのファイルを破損したり(null値を削除して)編集を拒否したりすることがあります。
  • vi改行以外の文字(「[不完全な最後の行]」)で終わるcpioアーカイブが検出されました。ファイルを保存するときに改行文字を追加します。他のアーカイブプログラム(除くcpio)はこれを改ざんとして検出し、変更されたアーカイブを拒否することがあります。
  • 他のアーカイブ形式では、メタデータ(変更日時など)をバイナリ形式で保存したり、チェックサムを持つことができます。これらのファイルの編集は、私がここで説明するよりも難しいかもしれません。

関連情報