如何测试 cp 命令将复制哪些文件?

如何测试 cp 命令将复制哪些文件?

我正在创建一个简单的脚本,用于复制 DIRECTORYA 中 DIRECTORYB 中不存在的所有文件。我通过使用 cp 命令来执行此操作:

cp -u DIRECTORYA/* DIRECTORYB

我还想做的是向管理员发送一封电子邮件,其中将列出已复制的文件。

因此,理想情况下,在运行上述命令之前,我希望获取将要复制的文件并将其存储在变量中,以便稍后在构建电子邮件时使用。

有人能指出我正确的方向吗?我研究过使用 grep 但我不认为这可以用 cp 命令来完成?

答案1

cp如果你想看看 GNU 不采取行动会做什么,我认为 GNU对你没有任何帮助。如果您想记录已修改的文件,可以使用以下-v选项:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

cp您可以使用同步,它的功能要强大得多,除了低端嵌入式系统外几乎所有地方都可以安装(并且在默认情况下不存在的情况下也很容易安装)。

rsync -aunv DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

或者

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log

答案2

根据手册页,

-u,--update
仅当复制来源文件是较新的比目标文件或当目标文件是丢失的

这是一项结合了两个测试的功能,其中一个在脚本中实现很简单(丢失的)和一个需要一些工作(较新的)。您可以制作一个脚本,使用commdiff和来报告所需内容test

没有一个标准cp实用程序提供空运行复制操作的功能。正如所建议的,rsync这是使用常用实用程序来执行此操作的方法。当然,rsync通常用于基于更多标准进行复制,而不仅仅是较新的或者丢失的(还使用文件大小和时间戳)。但它可以简化为只是做cp -u

对于非标准实用程序,有copy我在 20 世纪 80 年代末编写的实用程序(当然现在仍在使用)。它可能是受到该make实用程序的启发,因为我添加的第一个选项是-n.

对于给定的示例,它将像这样使用:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

进一步阅读:

  • copy - 文件/目录复制实用程序

    -n 禁用文件的实际创建或修改,并且(取决于详细程度)显示该文件的效果 copy 命令会有。
    -u 仅当文件大小或修改日期不同时才复制文件,并且仅当链接文本不同时才链接。
    -U 仅复制比目标新的文件或目标中不存在的文件。

  • 变更日志条目来自1988年8月:

    1988-08-16    
            * src/copy/src/copy.c: 添加了“-d”和“-n”选项。
    

答案3

如果你想跑cp foo*bar whatever,那就跑吧echo foo*bar whatever

答案4

考虑使用 rsync 代替。 Rsync 在本地副本上运行得非常好,一旦您浏览了它拥有的 15 个无数选项,它肯定可以做您想做的事情。

rsync -avun DIRECTORYA/ DIRECTORYB

将向您展示将要完成的一切,并且

rsync -avu DIRECTORYA/ DIRECTORYB

会做的。

相关内容