cp -u 复制所有文件,而不仅仅是较新的文件

cp -u 复制所有文件,而不仅仅是较新的文件

我正在source编写一个脚本,内容如下

cp -vau /home/jordan/local-directory/ -t /media/jordan/A368-480F/BACKUP/

,就是这样。A368-480F/是将 USB 插入计算机时出现的目录。第一次调用它时,它会执行我想要的操作并复制我的文件。如果我立即再次调用它而不拔下 USB,脚本不会说任何话并返回,就像它应该的那样。如果我拔下umountUSB,将其拔下,重新插入,然后重新执行source备份脚本,所有内容都会被再次复制,这不是我想要的。

我尝试stat在拔下 USB 之前和之后使用备份中的文件,但没有看到任何差异。不确定这是否适用于每个被复制的文件。

所以,我的问题是,“为什么会发生这种不必要的复制,我该如何避免它发生?”。

我正在使用 Ubuntu 15.04。

答案1

请记住,VFAT/FAT32/FAT16/等... Microsoft 的出色文件系统仅存储最小分辨率为 2 秒的文件时间。这意味着,如果您的源文件的 mtime 为 13:35:47,VFAT 会将其保存为 13:35:46。这意味着您的源文件将总是更加更新。

cp命令没有机制来处理MS的怪异行为,文件总是会被复制。

为了正确处理 VFAT 的有损时间存储,我建议使用同步

您给出了这个 cp 命令作为示例:

cp -vau /home/jordan/local-directory/ -t /media/jordan/A368-480F/BACKUP/

等效同步命令将是:

rsync -va --modify-window=1 /home/jordan/local-directory/ /media/jordan/A368-480F/BACKUP/

这将以递归方式将文件从源复制到目标,复制所有可能在 VFAT 上表示的属性。(权限、所有者、组……好吧……几乎所有东西……都不会复制到 VFAT,只有数据和偶数时间戳)

--修改窗口=1在确定新鲜度时,选项允许文件时间戳最多相差 1 秒。

我喜欢添加 -P(--partial --progress)选项,因为它可以更轻松地重新启动复制操作,并在进行时显示一个漂亮的进度条。

rsync -vaP --modify-window=1 /home/jordan/local-directory/ /media/jordan/A368-480F/BACKUP/

当然,rsync 还允许更多功能,包括在系统之间复制、快照备份等,请参阅rsync 手册页.我的手指可以打字-avzP我相信,这是 rsync 选项本身。

不,我不喜欢 VFAT。NTFS 更好,但是专有的。

相关内容