Я хочу скопировать содержимое одного файла в другой без замены файла назначения. Потому что мне нужно сохранить время создания файла назначения.

Хорошо, если время его изменения изменилось.

Как я могу это сделать?

3 ответа3

3

Не используйте cp тогда. использование

cat file.xxx > alreadyexistingFile.yyy

Это заменит содержимое файла, изменив время модификации, но не время создания.

3

Большинство файловых систем не отслеживают время создания файла. ctime записывает время последнего изменения, а не создания. Также есть atime (время последнего доступа) и mtime (время последней модификации).

ctime на самом деле не может контролироваться, но mtime может. Обратите внимание, что mtime - это то, что отображается при выполнении команды ls -l . Один из способов изменить mtime:

touch -m -t 201402011030 filename
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: - 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .