我想将一个文件的内容复制到另一个文件而不替换目标文件。因为我需要保留目标文件的创建时间。
如果它的修改时间改变了就好了。
我怎样才能做到这一点?
我想将一个文件的内容复制到另一个文件而不替换目标文件。因为我需要保留目标文件的创建时间。
如果它的修改时间改变了就好了。
我怎样才能做到这一点?
Answers:
使用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: -
不使用 cp
然后。使用
cat file.xxx > alreadyexistingFile.yyy
这将替换文件内容,更改修改时间而不是创建时间。
(struct stat *)->st_ctime
等于文件更改时间,而不是人们可能怀疑的文件创建时间,并且每次文件内容更改时都会更改,无论内容如何更改,因为这是文件系统完成的操作。例如,GNU / Linux系统中最常用的文件系统往往表现得像这样。
大多数文件系统不跟踪文件创建时间。 ctime记录上次更改的时间,而不是创建时间。还有atime(上次访问的时间)和mtime(上次修改的时间)。
ctime无法真正控制,但mtime可以。请注意,mtime是您执行时列出的内容 ls -l
。改变mtime的一种方法是:
touch -m -t 201402011030 filename
>
,因为你想要替换文件内容。请检查您的格式 - 代码需要反引号和缩进4个空格。您可以 编辑 你的帖子随时都可以使用下面的预览窗口。