具有多个选项的 Linux 复制命令

具有多个选项的 Linux 复制命令

我知道这可能是一个非常简单的问题,但我想将较新的文件从一个服务器目录复制到另一个服务器目录并保留日期戳。

我已经尝试过并且cp -p /source/records_added*.csv /dest/targetdir正在复制的文件最终会以它们被复制到新目的地的时间结束。-pu-pf

有办法实现这个吗?

答案1

正确答案是cp -p source dest,您已经知道了。因此,正确的问题可能是:为什么您看不到保存的时间?您可能不知道的是,在现代 Linux 系统上有四个不同的时间,但只有两个可以保存。

时间如下:

A - 访问时间。每次读取文件时都会自动更改,但安装选项可以减少访问时间(通常是为了减少闪存驱动器的磨损)。(这通常意味着该文件不应被视为移动到长期存储的候选文件,但这是 Unix 和 Linux 从未实现的功能。)

M - 修改时间。这通常是数据最后一次被更改的时间。这通常意味着文件需要再次备份。这是通常显示的时间ls -l

C - 创建或更改时间。这是最后一次更改 inode 的时间,包括创建文件、扩展文件以及更改权限或所有权。这最初被称为“创建”时间,但由于它很容易更改,因此现在被称为“更改”时间。

B - 出生时间。这是您实际创建此文件的时间。这相对较新,可能并非存在于所有文件系统中。

现在,通过任何人描述的任何方法进行复制都只能保留访问和修改时间,并且cp -p确实如此。您可以使用命令检查所有四个时间,可能具有纳秒的精度stat

另一个问题是,某些文件系统可能不遵守某些保存时间的尝试。一个明显的例子是,FAT 文件系统只有一个时间。网络文件服务器可能也不遵守某些类型的更改请求(您确实使用了术语“服务器”)。

还有一点:如果您使用的是cp -pu,那么我不希望文件采用较旧的修改时间。这就是所做的-u。(即,如果目标较新,它会阻止复制。)

答案2

虽然 David G 的回答无疑是正确的,但我想提供一种不同的方法—— cp 并不总是能做到这一点,如果你有幸在较旧的 UNIX 系统上工作,那么这是从 复制到 的/source/dir技巧/target/dir

(cd /source/dir;tar cf - *)|(cd /target/dir;tar xvf -)

要取消这个:

  • tar cf - *将所有内容存档到一个文件中-,即stdout
  • tar xf -解压档案stdin
  • |将一个连接到另一个,从而创建一个将源目录复制到目标的管道

tar除其他外,它不遵循软链接,因此复制大量不想要的数据的风​​险较小。它还保留所有权和权限。

我已经这么老了,这仍然是我喜欢的方式。

相关内容