Я хочу скопировать содержимое одного файла в другой без замены файла назначения. Потому что мне нужно сохранить время создания файла назначения.
Хорошо, если время его изменения изменилось.
Как я могу это сделать?
Не используйте cp
тогда. использование
cat file.xxx > alreadyexistingFile.yyy
Это заменит содержимое файла, изменив время модификации, но не время создания.
Большинство файловых систем не отслеживают время создания файла. ctime записывает время последнего изменения, а не создания. Также есть atime (время последнего доступа) и mtime (время последней модификации).
ctime на самом деле не может контролироваться, но mtime может. Обратите внимание, что mtime - это то, что отображается при выполнении команды ls -l
. Один из способов изменить mtime:
touch -m -t 201402011030 filename
То, что вы просите, невозможно, используя большинство файловых систем, доступных в системах 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: -