我正在source
编写一个脚本,内容如下
cp -vau /home/jordan/local-directory/ -t /media/jordan/A368-480F/BACKUP/
,就是这样。A368-480F/
是将 USB 插入计算机时出现的目录。第一次调用它时,它会执行我想要的操作并复制我的文件。如果我立即再次调用它而不拔下 USB,脚本不会说任何话并返回,就像它应该的那样。如果我拔下umount
USB,将其拔下,重新插入,然后重新执行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 更好,但是专有的。