在OS X上复制文件时可以保留时间戳吗?


14

我有兴趣将三台Mac的文件组合在一起,方法是将每台Mac的文件复制到外部硬盘驱动器上我设计的单个文件夹层次结构中。

根据我过去在OSX中复制文件的经验,有时文件会丢失其“创建”和“修改”时间戳。即,将它们更改为发生文件复制时的当前时刻。

我如何确保不会发生这种情况?


您何时失去时间戳记?
2013年

如何复制它们?
格里

Answers:


11

我自己遇到了这个问题,内置cp命令实际上可以处理它。

我发现了一堆旧的CF卡,我想从中提取图片。我的处理脚本将查看文件mtime,以将其放置在正确的位置,因此我需要保留它。

手册页

 -p    Cause cp to preserve the following attributes of each source file in the copy: modification time,
       access time, file flags, file mode, user ID, and group ID, as allowed by permissions.  Access
       Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also be pre-
       served.

       If the user ID and group ID cannot be preserved, no error message is displayed and the exit value
       is not altered.

       If the source file has its set-user-ID bit on and the user ID cannot be preserved, the set-user-
       ID bit is not preserved in the copy's permissions.  If the source file has its set-group-ID bit
       on and the group ID cannot be preserved, the set-group-ID bit is not preserved in the copy's per-
       missions.  If the source file has both its set-user-ID and set-group-ID bits on, and either the
       user ID or group ID cannot be preserved, neither the set-user-ID nor set-group-ID bits are pre-
       served in the copy's permissions.

因此,使用zsh我能够运行(NO NAME作为我的卡卷名称):

cp -rvp /Volumes/NO\ NAME/DCIM/**/*.{JPG,jpg} ~/Desktop/tmp/pics

我相信特殊/**/*构造是ZSH特有的;但是你可以做类似的事情

find /Volumes/WHATEVER -type d -print0 | xargs cp -vp {}/*.JPG /my/out/path

+1一个简单cp -p明了的方法,可以保留修改后的时间(可能是文件中三个时间戳中最有用的时间),并且不需要创建中间存档文件。
wberry

1
据我所知,“ cp -p”会忘记创建日期,而是将其设置为修改日期。这是很荒谬的行为。
Nicolas Barbulesco 2014年

1
cp -p从HFS +复制到FAT32时不起作用。
NobleUplift

9

我使用rsync进行这种复制。但是请注意,Apple提供的版本是2.6.9,并且存在此错误。因此,您需要让第三方构建一个自己构建或通过包管理器构建的第三方

例如

rsync -aE source_dir target_dir

该选项-E复制ACL并-a保留UNIX权限和时间。(好吧,它在rsync 2上做了rsync 3似乎需要-AX)

rsync 还可以设置为不安装驱动器而复制到远程计算机。

rsync有一些GUI前端,例如aRsync。对于其他目录同步工具,请参阅此问题


rsync是一个很好的解决方案,但请注意,它不会保留访问时间。pax(请参阅下面的答案)。
jaume

1
据我所知,“ rsync”会忘记创建日期,而是将其设置为修改日期。这是一个很大的失败。
Nicolas Barbulesco 2014年

→jaume:对“文件b”进行“文件a”的任何形式的复制的任何命令必须首先读取“文件a”。因此,应修改“文件a”的访问时间。这不是命令级别的功能,而是内核级别的功能。如果命令通过另一个系统调用将访问时间恢复到其先前的状态,则这是一个危险的把戏,因为这是一个简单的谎言
2014年

→尼古拉斯:比照 man rsync并搜索preserve times:)⇒马克的答案是正确的。
2014年

1
→Mark,@ daniel-我刚刚在Mac OS X 10.6.8中测试了rsync。具有“ rsync -rt”的文件夹的本地副本会忘记文件的创建日期,并用其修改日期替换它。尽管手册“ rsync”对选项说“保留时间” -t。该错误可能也存在于Mavericks和Yosemite中。
Nicolas Barbulesco 2014年

4

使用pax。默认pax格式称为ustar,保留文件修改和访问时间(以及其他信息,例如用户ID,组ID,文件模式位和扩展属性,例如Spotlight注释和ACL)。有关更多详细信息,请参见此处的pax手册页。

首先,pax在每台Mac上创建一个存档,然后将其复制到外部硬盘驱动器,如下所示:

  1. 打开应用程序>实用程序>终端。
  2. 输入终端:

    $ cd
    

    并将要合并的文件在该Mac上的文件夹拖动到终端:

    在此处输入图片说明

    或者,您可以键入完整的文件夹名称:

    $ cd /path/to/your\ folder
    

    这会将当前文件夹更改为“您的文件夹”。

  3. 使用以下命令归档文件夹pax

    $ cd ..
    $ pax -w "your folder" > yourfolder.ustar
    
  4. 使用Finder将新创建的存档复制yourfolder.ustar到外部硬盘驱动器。

然后使用以下命令提取档案pax

  1. 在已插入外部USB硬盘驱动器的Mac上打开终端。

  2. cd如上所述,使用命令将当前文件夹更改为外部硬盘驱动器上的单个文件夹层次结构:

    $ cd /Volumes/externalHDD/path/to/single \folder
    $ ls
    yourfolder.ustar
    yourfolder2.ustar
    yourfolder3.ustar
    
  3. 提取档案:

    $ pax -r -p e < yourfolder.ustar
    $ pax -r -p e < yourfolder2.ustar
    $ pax -r -p e < yourfolder3.ustar
    $ ls
    your folder
    your folder 2
    your folder 3
    
  4. 如果需要,可以使用Finder移动文件(Finder保留文件修改和访问时间在同一卷内)。

(我已经在OS X 10.8(Mountain Lion)上测试了此过程。)


1
文件名超过200个字符的文件名不起作用community.hpe.com/t5/Ignite-UX/…–
amleszk

0

使用zip压缩它们,或者使用ctrl单击或右键单击选择它们,然后选择“压缩”。将压缩文件复制到目标系统并在其中打开它们。

如果可以,请将外部驱动器格式化为Mac OS文件系统,而不是FAT。


不能按住Option键单击。按住Ctrl单击。或单击鼠标右键。
Nicolas Barbulesco 2014年

1
格式化磁盘的最佳选择是Mac OS Extended Journalled。Mac OS Extended也称为HFS +。
Nicolas Barbulesco 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.