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

Jam*_*mes 14 cp file-copy

我正在创建一个简单的脚本,用于复制 DIRECTORYA 中不存在于 DIRECTORYB 中的所有文件。我是通过使用 cp 命令来做到这一点的:

cp -u DIRECTORYA/* DIRECTORYB
Run Code Online (Sandbox Code Playgroud)

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

所以理想情况下,在我运行上述命令之前,我想获取将被复制的文件并将它们存储在一个变量中,以便以后在构建我的电子邮件时使用。

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

Gil*_*il' 7

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

cp -puv DIRECTORYA/* DIRECTORYB >copy.log
Run Code Online (Sandbox Code Playgroud)

代替cp,您可以使用rsync,它功能更强大,几乎可以安装在除低端嵌入式系统之外的任何地方(并且易于安装在默认情况下不存在的地方)。

rsync -aunv DIRECTORYA/* DIRECTORYB >what-would-be-done.txt
Run Code Online (Sandbox Code Playgroud)

或者

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Run Code Online (Sandbox Code Playgroud)


Tho*_*key 6

根据手册页

-u, 复制只有当文件更新比目标文件或当目标文件丢失--update

这是一个结合了两个测试的功能,一个在脚本中很容易实现(缺少),另一个需要一些工作(更新)。您可以使用comm,diff和制作一个报告所需内容的脚本test

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

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

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

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

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

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

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

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


VaT*_*aTo 2

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