文件时间修改指南:Windows与Linux下创建、修改、访问时间操作全解

发布时间:2026/9/7 16:58:46
文件时间修改指南:Windows与Linux下创建、修改、访问时间操作全解 做素材归档和系统维护的人基本都绕不开“文件的创建时间、修改时间、访问时间”这三个字段。我接到过不少求助很多人搞不清楚为什么文件明明复制过去资源管理器里显示的日期却总是不对也有人是想把某个项目的文件时间统一到一个节点方便后续按时间排序整理。这个需求看似简单真正做起来却有不少门道Windows 自带的右键属性只能看不能改cmd 只能做到“把修改时间刷成当前时间”真要精确指定过去某个时间点还得靠 PowerShell 或第三方小工具。Linux 下又有另一套规则访问时间和修改时间的查看方式也不太一样。这篇文章我打算把“文件时间怎么改”这条线完整捋一遍覆盖 Windows、Linux、WPS/Office 文档里的创建者信息和创建时间、Excel VBA 调用外部命令等常见场景。我会把每一类操作适合用什么工具、命令具体怎么写、踩过哪些坑都写出来尽量做到按图索骥就能解决实际问题。1. 内容整体设计与思路拆解先把“时间”这件事搞明白1.1 三个时间戳分别代表什么为什么 Windows 下会有三个很多人在改时间之前最大的问题不是“命令不会写”而是根本没搞清楚自己到底要改哪一个时间。以 Windows 的 NTFS 文件系统为例一个文件在属性层面真正存了三套时间创建时间CreationTime这个文件第一次在当前目录被建立的时间。注意如果是复制进来的文件那么创建时间通常是复制动作发生的时间不是原文件的创建时间。修改时间LastWriteTime / 修改日期文件内容最后一次被写入的时间。多数时候我们在资源管理器里看到的“修改日期”就是它。访问时间LastAccessTime文件最后一次被程序读取或打开的时间但 Windows 出于性能考虑在很多版本下默认会关闭对访问时间的实时更新所以这个值不一定可靠。拿生活里的例子类比一个文档就像是菜谱创建时间是这张纸刚打印出来的时间修改时间是你在上面用笔潦草改过几轮的最新时间访问时间是最近一次有人翻开它看的时间。三者彼此独立但很多人经常把“创建时间”和“修改时间”混为一谈于是会出现一种很尴尬的情况文件内容明明是去年写的复制到新电脑后修改时间还是去年创建时间却变成了今天最后排序看起来乱七八糟。Linux 下则是另一个体系和 Windows 有一点非常关键的差别它没有直接叫“创建时间”的字段stat输出里的ctime全称是Change Time也就是文件元数据最后一次被系统变更的时间。比如你改了文件权限、改了属主甚至执行了touchctime就会更新。新手如果查资料看到“什么都能改”或“创建时间怎么改”很容易在ctime上栽跟头所以我建议把概念层面的差异先记住后面实操才不会被执行结果搞懵。1.2 什么场景需要动时间戳工具选型的基本思路在实际需求里“修改文件时间”通常不是单纯折腾而是有明确目的。我见过比较多的场景有这么几类资料归档整理项目结束以后甲方要求把所有交付文件的时间统一成某个验收节点避免看起来像临时拼凑。素材库去乱从网盘、微信、U盘拷来拷去的图片和文档修改时间被覆盖成了系统下载时间需要按真实拍摄或编辑时间批量重排。测试环境/脚本依赖某些校验逻辑会拿目标文件时间和当前时间做比较测试时需要人为伪造“文件未过期”或“文件刚好过期”的状态。开发调试比如 SideQuest 这类需要往 Android 设备推文件工具推送后文件时间往往变成实际推送时刻与本地原文件不一致也要通过命令行同步时间。正因为场景不同选工具的思路也就不同单个文件且要精确到秒我首选 PowerShell批量几百个文件且还要处理子目录可以考虑写一小段循环或用图形化小工具Linux 服务器上则用touch加参数。接下来我就按照 Windows、第三方工具、WPS/VBA 场景、Linux这条线逐个展开。2. cmd 与 PowerShellWindows 自带的“改时间”方案2.1 cmd 下快速把修改时间改成“现在”如果只是想给某个文件刷一个新的“当前时间”传统 cmd 里有一个很经典的技巧copy /b 文件名 ,,这条命令的写法看着有点反直觉理解起来也不难copy /b是二进制模式复制,,表示后面没有追加的源文件也不带额外开关。由于没有目标文件名copy会认为目标就是源文件本身于是它对文件做了一次“自己复制自己”的空操作。NTFS 在这个过程中会更新文件的修改时间从而把 LastWriteTime 刷新为系统当前时间。注意这个命令只能把时间改成“现在”不能把修改时间改成任意指定的过去时刻更不能改创建和访问时间。如果只是想让一个临时生成的报告看起来是刚才输出的那这一条就够了。缺点是它本质上可能触发一次文件重写所以文件被占用、被锁定或处于只读状态时会直接报错我在实际使用中基本只在本地非只读文件上用它。还有一个小地方值得留意copy /b 文件名 ,,后面有空格和连续两个逗号不要把逗号写成中文逗号也不要漏掉任何一段。有人图省事写成copy /b 文件名这不会更新修改时间。cmd 对语法相当死板经常敲错命令还回显一个“文件名、目录名或卷标语法不正确”排查时先检查逗号格式。2.2 用 PowerShell 精确指定创建时间、修改时间、访问时间如果你想把时间改成某个具体的历史时间比如将一份合同的修改时间统一回退回它的编辑日期cmd 就无能为力了这时候我用 PowerShell。最常见的单文件写法是这样$file Get-Item -LiteralPath D:\测试\报告.docx $file.CreationTime 2024-01-15 09:30:00 $file.LastWriteTime 2024-01-15 10:00:00 $file.LastAccessTime 2024-01-15 10:00:00这里先通过Get-Item拿到了文件的 [System.IO.FileInfo] 对象然后依次给它的三个属性赋值。PowerShell 底层传给 .NET 之后最终会调用 Windows 的文件时间接口所以效果等同于系统的 API 直接修改不是什么旁门左道。怕文件路径里有中文或空格我强烈建议加-LiteralPath。不加的时候路径里的方括号会被当成通配符处理比如你文件名本身叫报告[2024].docx用它基本会找不到文件。改成-LiteralPath以后字符串里特殊字符都会被当成字面路径解析这是我在脚本里踩过的比较典型的坑。另一个常见写法是把所有命令压缩成一行如果是在 cmd 窗口里临时应急也可以直接这样调用powershell -NoProfile -Command (Get-Item D:\test\a.txt).LastWriteTime2024-05-20 14:00:00这种一行写法适合临时跑一次。但有两个问题第一命令太长时 PowerShell 对单引号和双引号的嵌套解析比较麻烦路径里有空格就更头疼第二如果连续设置多个属性每次都重新Get-Item会多一次文件枚举。所以我更推荐把多行命令存成.ps1脚本文件运行起来也更可控。2.3 批量修改整个文件夹或目录树有时需要改的不是一个文件而是整个目录下面的所有文件。我之前整理老项目时遇到过这种情况几十个文件夹里几百份文档全部时间都变成了迁移当天的日期又没法手动一个个右键调整。这种情况我直接写一个 PowerShell 循环$targetTime Get-Date 2024-06-01 10:00:00 Get-ChildItem -Path D:\历史项目 -Recurse -Force | ForEach-Object { $_.CreationTime $targetTime $_.LastWriteTime $targetTime $_.LastAccessTime $targetTime }执行完成后目录里所有文件和子目录的三项时间都会统一成脚本里指定的$targetTime。使用-Recurse就是为了递归处理-Force则能把隐藏文件和系统文件也纳入范围。如果不想动隐藏文件把-Force去掉就行。这个方案里有几个细节我建议额外关注如果某些文件正被 Excel、Word 或媒体播放器占用PowerShell 会抛出“对路径的访问被拒绝”中断整个循环。更稳妥的做法是在脚本开头加-ErrorAction SilentlyContinue或者try/catch跳过被占用的文件不要在几百个文件里刚跑到第 20 个就卡死。时间和时区也要注意。Windows 默认显示的是本地时间文件系统底层实际存的是 UTC 时间。我在做系统迁移时想统一成“北京时间 10 点”结果写 UTC 时间执行页面显示成了 18 点反而不对。用Get-Date 2024-06-01 10:00:00生成的字符串会被 PowerShell 按本地时区解析一般没问题但如果你自己拼接 UTC 时间就要小心偏移。对文件夹本身设置时间也会影响排序。在资源管理器中文件夹的“修改日期”列来自文件夹对象的 LastWriteTime所以如果只想让文件时间改不要把Get-ChildItem的输出范围扩大到了目录对象但通常批量归档时连目录一起改反而更符合预期。3. Windows 图形化工具不想写命令时的批量方案3.1 用小工具处理 Windows 10/11 的文件夹时间有的朋友看到 PowerShell 就头大更希望在资源管理器里点点鼠标就完成。说实话Windows 自带界面里确实没提供“手动输入创建时间/修改时间”的入口第三方小工具在这块反而做得更顺手。我用过比较多的一款叫 BulkFileChanger它可以针对多个文件统一修改创建时间、修改时间、访问时间。操作逻辑基本是打开工具通过菜单里的“Add Files”把需要处理的一个或多个文件加进来。用 Ctrl 或 Shift 多选目标文件。在菜单中选择修改时间相关操作比如设置时间、设置为当前时间、按文件名替换时间等。填写想指定的“创建时间、最后修改时间、最后访问时间”点击应用。和 PowerShell 相比最大的优势是可以可视化看到每个文件的原有时间减少误操作。而且这类工具批量处理大数量文件时内部逻辑往往已经考虑过跳过系统文件、隐藏文件或只读文件等情况比手写脚本更省心。既然是第三方工具就一定要选正规来源。下载时注意核对软件名称很多下载站会捆绑安装包。还有工具尽量以管理员身份运行否则遇到受保护的系统文件或权限受限目录时点击应用可能没有反应。工具只是调用了系统接口并不会绕过 NTFS 权限这点需要提前有心理准备。3.2 Attribute Changer右键菜单直接改目录时间如果你的需求集中在“Windows 10 更改文件夹修改时间”我比较推荐 Attribute Changer。这款工具装完以后会在文件夹右键菜单里多出一项“Change Attributes”可以对文件夹自身时间、内部所有文件或子目录时间进行设置。窗口里的“Date/Time”标签页长这样有可勾选的日期时间输入框下面还能选“Only apply to files”“Only apply to folders”“Apply to all files/folders”等范围。对于不熟悉命令行的朋友这个界面比 BulkFileChanger 更直白因为它把“是否能递归到子目录”做成了图形化开关。勾选以后可以直接把文件夹的创建时间和修改时间改成指定值也能把里面的所有文件时间一起改掉。我记得有一次帮朋友整理一个几千张照片的相册照片分布在多层目录里如果用资源管理器排序根本看不出拍摄时间我就用 Attribute Changer 把最外层相册文件夹的“修改日期”统一到一个拍摄节点然后再配合 EXIF 工具处理内部照片。这里有个需要注意的地方图形化工具在处理超大文件量时会比较占资源屏幕看起来像“卡死”其实是后台正在逐文件刷新元数据不要急着强制结束进程。先拿一个包含少量文件的测试目录跑一遍确认范围选择正确再正式执行。4. WPS/Office 文档里的时间与作者信息VBA 联动的实操思路4.1 WPS 文档里“创建时间、创建者”要怎么彻底删除很多找“wps怎么彻底删除创建时间及创建者”的朋友实际上是被文档的内嵌元数据坑了。文件在资源管理器里显示的创建时间只是文件系统层面的属性而 Office 或 WPS 文档内部还会存着一套“文档属性”里面包括作者、单位、创建时间和最后保存者。这套信息会跟着文档文件一起被发送出去别人拿到文件后在“文件—属性—详细信息”里就能看到创建者相关信息所以有时候你改了文件系统时间但文档属性里的创建时间依然顽固。如果只是想清理 WPS 文档里的创建者和作者信息建议按下面两步走在 WPS 中打开文档点击“文件”—“属性”打开“摘要”标签页把“作者”“单位”“备注”这些字段里的内容删掉然后保存。用组织检查类的清理功能。WPS 里通常可以从“文件”—“另存为”的对话框里找到“工具”—“安全选项”之类的隐私清理入口在较新的版本里也可以从“审阅”或“文档安全”下拉菜单里找到“权限和元数据清理”“一键清理文档隐私信息”等选项不同版本的位置略有差异。需要说明的是清理文档属性不等于清理文件系统里的“创建时间”。文档属性里的创建时间通常在新建文档时写入一次之后就算删掉作者这个字段也可能仍保留。最彻底的办法是把内容全部复制到一个全新的空白文档中并另存为新文档会继承当前用户信息创建时间也会变成另存为的时间但这样做会丢掉一部分内嵌历史记录。如果只是要求不高、追求干净交付这是最省事的兜底方案。这里还有一点需要提醒把文档作者清空只影响往后的文档属性并不能追溯删除别人电脑上缓存过的“历史版本”。另外文件系统三时间和文档“创建时间”不是一回事操作前想清楚到底要清的是哪一层避免白忙活。4.2 Excel VBA 能不能改文件时间怎么写更可靠网上一搜“excelvba修改文件时间”不少人以为用 VBA 的一行FileDateTime函数就能实现修改。实际上FileDateTime是只读函数它只能返回一个文件最后写入的时间不能反向赋值。VBA 本身也没有直接暴露创建时间或访问时间的修改接口。那是不是就没办法了也不是。更通用的做法是让 VBA 调用 PowerShell由 PowerShell 去修改目标文件时间。下面是一个示例脚本# 假设这是 Set-Time.ps1 $target D:\测试\report.xlsx $item Get-Item -LiteralPath $target $item.CreationTime Get-Date 2024-03-10 09:00:00 $item.LastWriteTime Get-Date 2024-03-10 09:00:00 $item.LastAccessTime Get-Date 2024-03-10 09:00:00然后在 Excel 的 VBA 编辑器里这样调用Sub ChangeFileTimeByPS() Dim sh As Object Set sh CreateObject(WScript.Shell) sh.Run powershell -NoProfile -ExecutionPolicy Bypass -File D:\测试\Set-Time.ps1, 0, True End SubVBA 里的Shell或WScript.Shell不会等 PowerShell 执行完再继续代码所以我会把第二个参数设成True实现同步等待避免 VBA 代码都跑完了文件时间还没改完。路径中有空格时外层要用双引号把整条命令行包起来内层给具体文件和脚本路径加双引号因此代码里出现了连续两个双引号的写法这在 VBA 字符串里代表一个真正的双引号缺少任何一个都会让命令解析失败。不过这个方法有一个前提你需要允许 Excel 执行.ps1如果公司电脑有策略限制PowerShell 默认可能运行失败。更保险的替换办法是在 VBA 里直接调用 C# 风格的 Windows APISetFileTime但声明 API、获取句柄的代码量比较长对普通用户不够友好。我的个人建议是偶尔用一次就走 PowerShell 脚本经常做批量处理就干脆把逻辑写成 PowerShell 文件不必依赖 Excel VBA。4.3 顺带说说 SideQuest 备份文件的时间错乱问题搜索“sidequest 修改时间”的朋友里一部分可能是做 VR 游戏存档备份时发现从 Quest 设备或 SideQuest 拉下来的文件在电脑上看时间都变成了备份当下的时间。这个问题的本质是跨系统文件复制。SideQuest 在 Windows 上通过 USB 把 Android 文件系统里的文件复制到 NTFS 时Windows 只会给文件分配一个全新的创建时间修改时间则可能保留原值也可能因为设备驱动不同而丢失。处理这类设备文件的通用思路是把文件先放到本地电脑再用本文前面提到的方法统一定制时间如果必须在设备目录里直接修改在 Android shell 里面也可以执行touch命令来修改时间只不过 Windows 下没法直接对一个 adb 路径生效。所以我通常建议先拉回本地整理好再推回去。这样既能保留文件内容又能用上面 PowerShell 或图形工具按自己的规则设定时间整个过程更可控。5. Linux 下查看与修改“访问时间、修改时间”一起说清楚5.1 用 stat 查看访问时间和修改时间Linux 用户搜索“linux查看文件的访问时间”最常见的答案就是stat。在终端里执行stat /var/log/syslog输出会很像这样File: /var/log/syslog Size: 1048576 Blocks: 2048 IO Block: 4096 regular file Device: ... Access: (0644/-rw-r--r--) Uid: ( 0/root) Gid: ( 0/root) Access: 2024-06-01 10:00:00.000000000 0800 Modify: 2024-06-01 09:15:00.000000000 0800 Change: 2024-06-01 09:15:00.000000000 0800 Birth: 2024-05-30 14:00:00.000000000 0800这里唯一读起来容易混淆的就是Access、Modify、Change三行。默认情况下很多发行版开启了relatime挂载参数所以Access不一定每次打开文件都刷新而是仅在访问时间早于修改时间或已经超过一定时限时报一次因此 stat 拿到的访问时间可能不是“刚刚”的时间。如果想明确看到某一时间段内有没有人读取过文件建议先用stat看当前值再在触发访问后重新用stat对比不要一上来就怀疑命令有问题。如果是写脚本想直接抽取时间我喜欢用stat -c按格式输出stat -c 访问时间: %x%n修改时间: %y%nChange时间: %z test.txt%x是访问时间%y是修改时间%z是状态变更时间%n是文件名。这样输出更干净方便进一步拼接交给其他工具处理。5.2 touch把访问时间、修改时间改成指定值或当前时间Linux 下修改文件时间的主命令是touch它同时支持改 atime 和 mtime也可以改 btime很遗憾不行touch没有直接修改“创建时间/出生时间”的标准选项。最基本的用法是把一个已存在文件的访问时间和修改时间都改成当前时间touch test.txt如果只想修改访问时间用touch -a test.txt只想修改修改时间用touch -m test.txt把时间指定成某个历史时间点同时改 atime 和 mtimetouch -a -m -d 2024-05-01 08:30:00 test.txt使用-t也可以指定格式例如202405010830.00代表 2024 年 05 月 01 日 08 点 30 分 00 秒touch -a -m -t 202405010830.00 test.txt-d的字符串写法更自然能直接解析“2024-05-01 08:30:00”实际中不容易写错我更常用它。还有一个非常好用的-r选项可以把参考文件的时间原样复制过来touch -r /path/ref-file.txt /path/target-file.txt这在批量同步素材时特别合适先挑出一个正确时间的主文件再把其他文件通通对齐到它逻辑清晰也不用脑内反复换算时间格式。5.3 为什么 Linux 的 ctime 不能被手动指定很多人看到stat里Change时间就以为它是“创建时间”并尝试修改实际上它无法通过touch -d直接设置。ctime记录的是 inode 变更的时间只要你对文件做过一次chmod、chown甚至touch本身ctime就跳到了当前时刻。你可以理解为登录网站时看到的“最后修改个人资料时间”由系统自动更新而不是自己手动指定的“注册日期”这两个东西不能混为一谈。如果你想改的是文件内容里的某个日期字段那touch也帮不上忙得用 sed、vim、python 等去改内容本身。很多测试脚本想伪造成“一天前修改”常规操作是touch -m -d 1 day ago file这个简单有效但别指望能通过命令伪造“系统层面的 Change 时间”除非你能控制文件系统层实现那已经跑出常规运维范畴了。在实际的运维排障中还需要关注挂载参数。比如mount -o noatime时文件和目录的访问时间不会随读取而更新relatime模式下只有 atime 早于 mtime 或被访问了一段时间后才更新。所以你在某个系统上做实验时发现touch -a设置完以后过一会儿 atime 又被刷新了别急着判断是命令写错先看一下挂载选项。6. 常见问题与排查技巧实录6.1 改完时间之后资源管理器没有立刻刷新这个现象不止一次遇到PowerShell 里明明执行成功返回了输出再看资源管理器日期还是老样子。原因通常有三种资源管理器缓存了视图元数据还没有重新读取目录。按 F5 刷新一下通常就好了。该目录被 OneDrive、坚果云、Dropbox 等同步软件接管文件由同步代理层提供虚拟视图改的是本地缓存里的时间云端状态没同步回来时界面可能仍是旧值。文件被其他进程把持PowerShell 写入时报错但被静默忽略。如果脚本加了-ErrorAction SilentlyContinue你看到的是没有异常但文件其实没改成功。所以重要文件改完后我习惯用Get-Item再读一遍Get-Item -LiteralPath D:\测试\a.txt | Format-List CreationTime, LastWriteTime, LastAccessTime只有回读确认正确才算真的完成了。6.2 权限不足、只读文件、被占用时的备用办法遇到“拒绝访问的”错误时很多人第一时间想的是用管理员权限运行工具。PowerShell 窗口确实要以管理员身份运行才能修改一些系统目录里的文件但同等问题还有只读属性。只读文件的数据流中可以写入元数据但部分第三方工具会直接把只读文件跳过。被 Excel/WPS 打开着的文件尤其顽固办公软件会以独占方式锁定文件句柄PowerShell 往往只能读取时间而无法写入。我的解决方案是先通知相关人员关闭文件实在没法关闭的就先把文件复制一份临时副本对副本执行时间修改再把它改回原文件名覆盖。覆盖后文件的创建时间会再次变化所以最后还要再对覆盖后的文件重新做一次时间设置。如果是文件夹本身权限不足可以在文件夹属性的“安全”标签页给当前用户添加“修改”授权。命令行下可以快速通过icacls处理但我不建议随便对系统盘根目录交权容易引发安全问题。一般修改自己用户目录下的文件很少遇到这套麻烦。6.3 快速定位问题常见需求速查表你想做的事推荐做法注意事项Windows 把文件修改时间改成“现在”cmd中使用copy /b 文件名 ,,只能刷新为当前时间不能指定过去时间Windows 指定某个文件的创建/修改/访问时间PowerShell 给CreationTime、LastWriteTime、LastAccessTime赋值路径含中文/空格时用-LiteralPath批量修改整个目录树的三时间PowerShell 结合Get-ChildItem -Recurse先排除占用文件回读验证结果Windows 图形化批量改文件夹时间BulkFileChanger / Attribute Changer用官方或正规来源管理员身份运行WPS 文档里清除创建者和创建时间文件属性里的作者信息清除 文档隐私清理文档内部元数据和文件系统时间是两回事Excel VBA 改外部文件时间VBA 调用 PowerShell.ps1脚本被打开/占用的文件无法修改Linux 查看访问时间和修改时间stat/stat -c区分ctime和文件创建时间Linux 指定修改 atime/mtimetouch -a -m -d 2024-01-01 08:00:00 文件touch不修改 btime/创建时间我做这类文件时间处理时最深的体会是不要只盯着“工具能不能改”先确认你改的是文件系统层时间还是文档内部元数据时间确认要改的是单文件还是目录树确认文件是否正被其他程序占用。把这几个问题问清楚剩下的事情基本就是一条命令或一个图形工具勾选的事。如果你要经常处理这类问题我建议把 PowerShell 的那段批量脚本保存成模板再把stat和touch的几个常用参数写进自己的速记本下一次使用时能少走不少弯路。