如何从命令行复制整个文件而不改变目标创建时间

如何从命令行复制整个文件而不改变目标创建时间

我想将一个文件的内容复制到另一个文件而不替换目标文件。因为我需要保留目标文件的创建时间。

如果其修改时间发生改变则没有问题。

我怎样才能做到这一点?

答案1

使用 GNU/Linux 系统上的大多数文件系统,您要求的功能都无法实现。这是因为文件系统的修改时间和创建时间是相同的。

不过,您可以先保存要替换的文件的时间戳,然后再应用时间戳。这几乎可以实现您想要看到的结果,即在内容替换操作中保存等于修改时间的创建时间。

为了使以下示例正常工作,您需要 GNU coreutils(通常在任何 GNU/Linux 发行版上可用并安装)stat(1)。

#!/bin/sh

s=`stat --format="%y" "$2"`
cp "$1" "$2"
touch --date="$s" --time=mtime "$2"

将其放在某个文件中,例如/usr/local/bin/specialcp

仅举一个关于其他一些答案的例子,看看使用以下命令替换文件内容时会发生什么>

user@host:~/work/j$ touch --date="Sun, 29 Feb 2004 16:21:42 -0800" j
user@host:~/work/j$ stat j
  File: `j'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 807h/2055d      Inode: 528815      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/     user)   Gid: ( 1001/     user)
Access: 2004-03-01 02:21:42.000000000 +0200
Modify: 2004-03-01 02:21:42.000000000 +0200
Change: 2014-04-26 12:28:51.257855694 +0300
 Birth: -
user@host:~/work/j$ cat /etc/profile > j
user@host:~/work/j$ stat j
  File: `j'
  Size: 665             Blocks: 8          IO Block: 4096   regular file
Device: 807h/2055d      Inode: 528815      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/     user)   Gid: ( 1001/     user)
Access: 2004-03-01 02:21:42.000000000 +0200
Modify: 2014-04-26 12:28:58.814855890 +0300
Change: 2014-04-26 12:28:58.814855890 +0300
 Birth: -

修改时间已更新。但是,使用 stat(1),您可以保存修改时间,执行内容替换/cp(1)/其他操作,然后稍后使用 touch(1) 替换时间戳。

rsync按照其他答案中的建议使用时也会发生同样的事情:

user@host:~/work/j$ touch --date="Sun, 29 Feb 2004 16:21:42 -0800" j
user@host:~/work/j$ stat j
  File: `j'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 807h/2055d      Inode: 528815      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1001/     user)   Gid: ( 1001/     user)
Access: 2004-03-01 02:21:42.000000000 +0200
Modify: 2004-03-01 02:21:42.000000000 +0200
Change: 2014-04-26 12:35:11.515865554 +0300
 Birth: -
user@host:~/work/j$ rsync -a /etc/profile j
user@host:~/work/j$ stat j
  File: `j'
  Size: 665             Blocks: 8          IO Block: 4096   regular file
Device: 807h/2055d      Inode: 530708      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1001/     user)   Gid: ( 1001/     user)
Access: 2014-04-26 12:35:19.198865753 +0300
Modify: 2014-02-08 08:59:51.000000000 +0200
Change: 2014-04-26 12:35:19.198865753 +0300
 Birth: - 

答案2

请勿使用cp。使用

cat file.xxx > alreadyexistingFile.yyy

这将替换文件内容,改变修改时间但不改变创建时间。

答案3

大多数文件系统不跟踪文件创建时间。ctime 记录上次更改的时间,而不是创建的时间。还有 atime(上次访问时间)和 mtime(上次修改时间)。

ctime 无法真正控制,但 mtime 可以。请注意,mtime 是您执行 时列出的内容ls -l。更改 mtime 的一种方法是:

touch -m -t 201402011030 filename

相关内容