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


0

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

如果它的修改时间改变了就好了。

我怎样才能做到这一点?

Answers:


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: - 

3

不使用 cp 然后。使用

cat file.xxx > alreadyexistingFile.yyy

这将替换文件内容,更改修改时间而不是创建时间。


3
其实你应该用 >,因为你想要替换文件内容。请检查您的格式 - 代码需要反引号和缩进4个空格。您可以 编辑 你的帖子随时都可以使用下面的预览窗口。
slhck

10x评论:-)
c0d3Sc1b3r

1
你确定这个有效吗?在大多数系统中 (struct stat *)->st_ctime 等于文件更改时间,而不是人们可能怀疑的文件创建时间,并且每次文件内容更改时都会更改,无论内容如何更改,因为这是文件系统完成的操作。例如,GNU / Linux系统中最常用的文件系统往往表现得像这样。
Sami Laine

@SamiLaine好点。我想你需要手动复制时间戳吗?
slhck

3

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

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

touch -m -t 201402011030 filename

但这是完全错误的。最初的问题是关于保留 目的地 文件修改时间和它的作用是复制修改时间 资源 文件到目标文件的修改时间。
Sami Laine

你是完全正确的。我最初的反应是错误的,我已经更新了。
Fred Kroon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.