如何在 Unix 中复制文件而不更改其上次修改时间?

Laz*_*zer 104 unix timestamp

如果我使用 将某个文件从某个地方复制到另一个地方cp,则复制文件上的时间戳将设置为复制的时间。

有什么办法可以避免这种情况吗?

我需要在不改变时间戳的情况下复制文件。

Arj*_*jan 125

cp -p诀窍。对于 Linux

-p 与...一样 --preserve=mode,ownership,timestamps

对于 FreeBSD

-p 使 cp 保留副本中每个源文件的以下属性:修改时间、访问时间、文件标志、文件模式、ACL、用户 ID 和组 ID,在权限允许的范围内。

对于OS X

-p使 cp 保留副本中每个源文件的以下属性:修改时间、访问时间、文件标志、文件模式、用户 ID 和组 ID,在权限允许的范围内。访问控制列表 (ACL) 和扩展属性 (EA),包括资源分支,也将被保留。

请注意,这可能会/将更改源文件的访问时间 (atime),如ls -lu. 此外,statorstat -x可用于很好地显示数据访问、数据修改和文件状态更改时间,对于 macOS,可以使用显式格式将出生时间添加到其中

stat -f "%n%N%nAccess (atime): %Sa%nModify (mtime): %Sm%nChange (ctime): %Sc%nBirth  (Btime): %SB%n" *
Run Code Online (Sandbox Code Playgroud)

  • cp -a 也很高兴知道,它不仅意味着 -p,还意味着 -R 复制整个目录和 -d 保留链接。 (33认同)
  • 请注意,在使用 GNU Coreutils 时,`cp -p` 不仅会保留时间戳,还会保留 [模式和所有权](http://www.gnu.org/software/coreutils/manual/coreutils.html#cp-invocation ) 和 [FreeBSD](https://www.freebsd.org/cgi/man.cgi?query=cp) 除了修改时间之外,它还保留了»访问时间、文件标志、文件模式、ACL、用户 ID 和权限允许的组 ID。« 和 [OS X](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/cp.1.html) 另外»扩展属性,包括资源分支«。 (2认同)
  • 正如 afathman 所说, cp -p 触及源文件的时间戳。这可以通过使用“noatime”挂载选项来避免,例如“mount -o remount,noatime /mnt”。 (2认同)

Ste*_*idt 19

当使用cpGNU Coreutils的,只保留时间戳,而不是属性,如用户ID,组ID或文件模式存在的速记--preserve,它允许明确指定属性的列表被保存下来。

cp --preserve=timestamps source destination
Run Code Online (Sandbox Code Playgroud)

请注意,其他 Unices 可能不支持此语法。另一种方法是使用在大多数安装中应该可用的--times参数rsync

  • 这是正确答案。使用 `-p` 不是正确的答案。`-p` 也保留所有权和模式。可能不想要什么......并且没有被问到。 (6认同)

gor*_*lla 13

在 Unix 文件系统上有 3 个时间,访问时间(atime)、修改时间(mtime)和 inode 更改时间(ctime)。您可以使用触摸程序更改访问时间和修改时间,例如

cp 原件复制
touch -r 原版复制

但是,您不能更改 inode 更改时间。

  • 有关 inode 更改时间,另请参阅 [linux - 设置创建或更改时间戳 - 堆栈溢出](http://stackoverflow.com/questions/4537291/setting-creation-or-change-timestamps) (2认同)