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


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.