我想将一个文件的内容复制到另一个文件而不替换目标文件。因为我需要保留目标文件的创建时间。
如果其修改时间发生改变则没有问题。
我怎样才能做到这一点?
答案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